这似乎是一个常见的问题,但尽管检查了许多建议的解决方案,但到目前为止对我们来说没有任何效果。
应用程序
这是一个简单的聊天应用程序,在现有应用程序的 JSON 库上添加了新界面。我们代理对其应用程序的所有调用,以避免 x 域限制 (IE8)。 ASP.net MVC3 应用程序;
它托管在 IIS6、W2K3 SP2 中。 DEV svr 有 1gig 内存,TEST svr 有 4gig 内存。
问题
当我们接近 20 个并发用户时,请求开始滞后 - 事件查看器中没有发现任何问题。看起来调用只是在排队。没有返回 503。
我们的尝试
- 我们使用 AsyncController 对第 3 方网络服务进行长轮询以获取结果 托管在 IIS6 中
- 我们使用 TPL 在 AsyncController 方法中调用他们的服务
- 我们已修改 processModel并设置 maxWorkerThreads=100。
- 我们查看了 this how-to但 HTTP.SYS 配置看起来可以服务无限数量的线程,因此我们不必费心添加注册表项。
- 第 3 方服务可以处理大量并发请求(并且位于网络场中,因此我们相当有信心我们是最薄弱的环节)
我们缺少什么? - 非常感谢任何帮助
最佳答案
嗯......差不多四个星期后,我想我应该更新这个,以防有人想知道是什么帮助我们克服了这些限制(我们在我们的 DEV 服务器上塞满了大约 100 个同步连接,1gig Xeon)。
异步 Controller
- 如果您有可能需要长时间等待的请求(即长时间轮询),请使用它们。
- 随意使用TaskFactory,但请务必将其标记为长时间运行的进程,如果存在线程中可能出现异常的风险,请务必使用ContinueWith,以便可以减少操作,并将错误返回给调用者。
服务点管理器
- 如果您要进行下游调用(即 WebService/第 3 方 API),请确保您已将 DefaultConnectionLimit 从默认的 2 个同时连接增加。
- 粗略的指导是 8 * Num 核心,这样您就不会耗尽传出连接资源。
- 参见this MSDN article on DefaultConnectionLimit了解更多信息。
IOCP 与 RestSharp
- 我喜欢 RestSharp 的 API,它非常棒,但它可能更适合客户端编程,而不是代理请求。我的错!!使用 HttpWebRequest 和 Begin/End 方法来利用 IOCP
- 如果您想要反向代理或网址重写,check out URL Rewriter, a great library available freely on CodePlex
最后,我们的问题不在于传入请求,而在于请求被代理给第三方,我们没有提供足够的连接,因此它们都在排队,滞后于整个系统。很高兴地说,经过大量阅读、调查和编码,我们已经解决了这个问题。
关于asp.net-mvc-3 - 无法通过长轮询为 20 多个连接 MVC3 IIS6 提供服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10330952/