我们尝试在我们公司的ERP中实施基于长期轮询的通知服务。与Facebook通知类似。
使用的技术:
timeout
sleep
经过近一个月的编码,我们开始生产。部署后几分钟,我们不得不回滚所有内容。事实证明,我们的服务器(8个核心)无法处理20名员工的长时间请求,每个服务器都使用约5个浏览器标签。例如:用户使用我们的ERP打开了3个选项卡,每个选项卡上都有一个长期轮询的AJAX。无法打开第4个标签页- 它会挂起,直到杀死前三个标签页之一(因此AJAX停止了)。
我们认为,“ Apache的局限性”。因此,我们进行了谷歌搜索。我找到了有关Apache MPM模块和配置的一些信息,因此我尝试了一下。如图所示prefork,我们的服务器使用MPM apachectl -l。所以我在配置中更改了几行,看起来像这样:
prefork
apachectl -l
<IfModule mpm_prefork_module> StartServers 1 MinSpareServers 16 MaxSpareServers 32 ServerLimit 50% MaxClients 150 MaxClients 50% MaxRequestsPerChild 0 </IfModule>
有趣的是,它可以在具有类似配置的本地计算机上运行。在服务器上,看起来Apache忽略配置,因为MinSpareServers设置为16时,它在重启后启动8。他不知道该怎么办。
MinSpareServers
在上一篇文章的第一条评论中,Passerby给了我很好的指导,以检查我们是否达到了与一台服务器的最大浏览器连接。
事实证明,每个浏览器都有这些限制,并且您无法更改(据我所知)。我们采取了一种解决方法以使其正常工作。
假设我正在AJAX从中获取数据
AJAX
http://domain.com/ajax
为避免浏览器连接数最大化,每个长轮询都AJAX连接到随机子域,例如:
http://31289.domain.com/ajax http://43289.domain.com/ajax
等等。有一个DNS服务器指向一个通配符从*.domain.com到domain.com,和子是唯一的随机数,由JS每个选项卡上生成。
*.domain.com
domain.com
还有的是也有一些问题AJAX Same OriginSecurity,但我们设法解决它,使用上都适当的报头JS和PHP两侧。
AJAX Same OriginSecurity
JS
PHP