同步 webapp 客户端(IIS 并发请求)

Posted

技术标签:

【中文标题】同步 webapp 客户端(IIS 并发请求)【英文标题】:Synchronize webapp clients (IIS concurrent requests) 【发布时间】:2012-07-05 07:47:32 【问题描述】:

任务: 我正在使用静态类,所以每个人都共享已经加载的数据。如果有人进行更改,该请求会将一个项目放入具有增量 ID 的列表中,我的想法是每个客户端在客户端都有它的版本并请求是否有任何更改。

我的解决方案:为此,我使用 $.post 超时时间为 5000 毫秒并发送客户端版本,在服务器端我有一个 500 循环的循环,用于检查是否有更新和中断循环,返回更改并在每个循环中有一个 10 毫秒的 Thread.Sleep,这样它就不会占用 CPU。如果在客户端超时,出现错误,我再次调用帖子,如果成功我处理返回数据,而不是再次调用帖子。这样一来,我几乎可以立即获得更改,而无需大量请求,如果出现故障,我只需要等待 5 秒即可恢复。

我的问题是当这个循环运行时,其他请求没有得到处理。使用 asp.net 开发服务器,没关系,因为它是单线程的。但win7hp iis7.5也是如此。

我尝试过的:在注册表中设置(HKLM\SOFTWARE\Microsoft\ASP.NET\4.0.30319.0\MaxConcurrentRequestsPerCPU),增加应用程序池的工作线程,更新aspnet。配置文件 maxConcurrentRequestsPerCPU="12" maxConcurrentThreadsPerCPU="0" requestQueueLimit="5000" 设置,我还读到我的win7hp应该能够使用3个线程。我还认为这是一种优化,我在一个请求中使用相同的变量,以便将其他变量排队,所以我评论了这些行,只留下了睡眠的 for 循环,但结果相同。

【问题讨论】:

请考虑用多个段落格式化未来的问题... 您希望同时支持多少用户? (1-10, 10-100,100-1000, >1000) 您传递给客户端的数据集有多大? “发送客户端版本”是指“增量ID”还是整个数据集? 这将是公司的内部同步,因此,10-100 之间就足够了。而且我只想发送更改,所以低于 1KB 响应 【参考方案1】:

不要在 ASP.Net 中处理请求的线程上使用 Thread.Sleep。这基本上会消耗线程并阻止启动更多请求。 ASP.Net 为处理您尝试更改的请求而创建的线程数存在限制,但是线程数过多会使进程的响应速度降低,并且很容易导致 32 位进程的 OutOfMemeoryException - 所以这不是一个好方法。

还有其他几个线程在讨论使用 ASP.Net 实现长轮询请求,例如这个 - Can ASP.NET MVC's AsyncController be used to service large number of concurrent hanging requests (long poll)? 和显然像这样的彗星问题 - Comet implementation for ASP.NET?。

【讨论】:

我已经尝试增加工作线程,但也导致请求挂起。我希望它能够处理其他请求,即使一个请求正在工作(或休眠) 我查看了建议的链接。我试过 websync,发现它做同样的事情,它启动一个查询,当一条消息到来时,它立即返回(并创建一个新的查询),如果它超时它只是启动一个新的查询。在等待消息发送时处理其他查询真的那么难吗?

以上是关于同步 webapp 客户端(IIS 并发请求)的主要内容,如果未能解决你的问题,请参考以下文章

IIS连接数IIS并发连接数IIS最大并发工作线程数应用程序池的队列长度应用程序池的

你真的了解:IIS连接数IIS并发连接数IIS最大并发工作线程数应用程序池的队列长度应用程序池的...

Windows 10 Home/Pro/Enterprise 上的 IIS 并发请求限制

工厂模式实现并发请求多个接口 (同步后台数据实现离线APP)

工厂模式实现并发请求多个接口 (同步后台数据实现离线APP)

在 IIS 上托管的 ASP.NET Core WebApp 上提供持久配置