Ajax长轮询限制

3
所以我和一个朋友正在构建一个基于Web的、具有jQuery和PHP核心的AJAX聊天软件。到目前为止,我们一直使用每两秒钟调用服务器查找更新的标准过程。然而,我已经开始不喜欢这种方法了,因为它不够快,也不是“成本效益高”的,即使没有数据返回,也会有大量的请求来回传递。
我们的一个项目支持者建议我们研究一种被称为COMET的技术,或者更具体地说,长轮询。然而,在阅读了不同的文章和博客帖子之后,我发现当与Apache服务器一起使用时,它并不那么实用。似乎大多数人只是说“这不是一个好主意”,但在处理多少个请求方面并没有给出太多具体的细节,可以在一次处理中处理多少个请求。
PureChat 的整个目的是为人们提供一个看起来很棒、运行快速,并且适用于大多数服务器的聊天工具。因此,我假设约96%的用户将使用Apache,而不是Lighttpd或Nginx,这些服务器据说更适合长轮询。
言归正传:
在您的意见中,是继续使用setInterval并重复请求新数据更好?还是采用长轮询更好,尽管大多数用户将使用Apache?此外,是否可能获得更具体的概述,即在Apache服务器崩溃之前可以有多少人使用聊天室?

2
Tomcat 7 最新增加了对 WebSockets 的支持,因此请考虑它作为另一种备选项与轮询回退一起使用。 - Andrew
如果这只是小规模的话,那应该不会有问题。但如果你计划有成千上万的并发用户,Apache 就会崩溃,因为对于每个连接,它都会打开一个新线程,这会消耗大量内存。NginX 只运行在单个线程上,因此可以扩展到许多连接。然而,如果你使用 PHP,这在许多情况下并不能像你想象的那样帮助你。请参见我下面的答案以获取详细信息。 - dqhendricks
1个回答

2
正如Andrew所说,socket连接是与服务器进行异步通信的终极解决方案,尽管目前只有最先进的浏览器支持WebSockets。socket.io是一个开源API,如果浏览器支持WebSockets,则可以使用该API初始化WebSocket连接,但如果浏览器不支持,则会回退到Flash替代方案。然而,对于使用该API的编码人员来说,这将是透明的。
Socket连接基本上保持了浏览器和服务器之间的开放通信,以便双方可以随时互发消息。socket服务器守护程序将保留已连接的订阅者列表,并在接收到订户之一的消息时,可以立即将此消息发送回所有订户。
然而,对于Socket连接,您需要在服务器上运行全天候的Socket服务器守护程序。虽然可以使用命令行PHP完成此操作(无需Apache),但它更适合像node.js这样的非阻塞服务器端JavaScript API。
就你谈论的长轮询而言,node.js也更好。基本上,node.js是事件驱动和单线程的。这意味着您可以保持许多连接打开,而无需打开太多线程,这将消耗大量内存(Apache的问题)。这允许高可用性。然而,您必须记住的是,即使您使用像Nginx这样的非阻塞文件服务器,PHP也会有许多阻塞网络调用。由于它正在单个线程上运行,每个(例如)MySQL调用基本上都会使服务器停止,直到返回该MySQL调用的响应。在此期间不会完成其他任何操作,使您的非阻塞服务器无用。但是,如果您使用像JavaScript(node.js)这样的非阻塞语言进行网络调用,这将不是问题。它将设置一个处理程序函数以处理响应,无论何时可用响应,允许服务器在等待时处理其他请求。
对于长轮询,您基本上会发送一个请求,服务器会等待50秒才响应。如果有什么要报告的,它会更早地响应,否则它会等待。如果在50秒后没有任何报告,则仍会发送响应,以便浏览器不会超时。响应将触发浏览器发送另一个请求,并重新启动过程。这允许较少的请求和更快的响应时间,但再次,不如Socket连接好。

另外,请记住,套接字服务器守护程序需要访问您服务器的套接字,这通常在共享服务器上是不允许的。您需要一个虚拟专用服务器(VPS)。 - dqhendricks
感谢您详细的回复,非常感谢。我在这里面临的问题本质上是,由于我们将聊天发布为开源软件,因此我们无法控制安装它的服务器。鉴于此,我们必须假设大多数用户将使用共享主机。因此,他们可能无法访问套接字,也不太可能安装Node.js。您认为我们最好实现带有用户限制/上限的长轮询,以便事情不会失控吗? - Scotty C.
老实说,我不太确定。就像你所说的,不同的服务器有不同数量的内存。我快速谷歌搜索了一下返回剩余内存量的PHP函数。但是我得到的都是返回已使用内存量的函数。 - Scotty C.
有没有 WebSockets 的替代方案? - moderns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接