AJAX轮询频率 - 长轮询还是短轮询?

14

我正在构建一个网页组件,需要进行相对频繁的数据库轮询。我可以看到两种不同的方法,想知道其中哪一种更好,或者是否缺少第三种选择。

1)每1或2秒发送一个AJAX请求以检查更新。每个请求无论是否有新数据都会立即返回。
2)触发一个单独的AJAX请求,直到它接收到数据或超时发生才返回。在其中任何一个情况发生时,它将触发下一个请求。(我认为这被称为长轮询?)

两种方法使用的数据库查询数量相同,但是使用#2会减少浏览器发出的请求,从而可以节省带宽和客户端资源。对于服务器来说,是更好地保持一个PHP请求保持活动状态并在查询之间休眠,还是每隔几秒钟启动一次,轮询数据库,然后关闭呢?或者没有区别,我太过于担心这个问题了吗?

编辑:我想我也应该说明一下,这是一个较大的Web应用程序中的聊天小部件。通信的轻微延迟不会对用户造成影响,因为聊天是次要功能。


这主要取决于长轮询的时间长度以及连接的客户端数量。如果只有两三个客户端,则长轮询可能更好(因为更新会是即时的)。但如果连接很多,长轮询将非常昂贵,因为每个连接都需要一个PHP进程(因为是PHP在保持它的开放状态)。因此,在这种情况下,我会使用“智能”轮询间隔。基本上,如果更新的平均时间为10秒,则轮询时间为5、8、10、11等。基本上就是把时间减半。这对服务器更容易(因为平均负载降低),同时速度也更快... - ircmaxell
我想我也应该说明一下,这是一个更大的Web应用程序中的聊天小部件。通信上的轻微延迟不会对用户造成影响,因为聊天只是一个次要功能。但我们希望它在合理的时间内完成(在2秒内?)。 - Derek
说实话,我不会用PHP做这个。选择另一种语言,实现一个队列系统,并使用持久的TCP连接来进行双向通信...或者,为什么不直接安装Jabber并完成(也许实现一个JS接口到服务器)... - ircmaxell
很遗憾,我无法控制基础设施...只能使用PHP。此外,由于安装环境的限制,像Jabber这样的东西也有限制。不过,您提供的建议非常好。 - Derek
2个回答

8
长轮询比轮询更具可扩展性(即服务器负载更小),同时响应时间更短。
如果您的收件人使用轮询,则消息的平均传送时间将是您轮询间隔的一半。
使用长轮询,它是即时的 - 只有在没有要说的话时服务器才会等待。
如果您正在进行聊天消息传递,请使用长轮询;这是一个可用性问题。
长轮询的缺点是实现起来更加复杂;但是它并不那么复杂,并且已被广泛实现。因此,如果您无法为所选的Web服务器使用现成的框架,则可以开始编写一个合理的框架,并使其工作。

1
同意。但是如果有十几个客户端同时访问系统,那就会有十几个 PHP 进程一直处于活动状态。就可扩展性而言,我想这不比每秒钟只有一半的客户端访问更糟糕。 - Derek
确保这些进程良好地休眠,不要在它们自己的轮询中,并且一切都会很顺利。当您拥有几百个或更多客户端时,请担心。 - Will

2

您还可以查看最新浏览器的一部分——WebSocket(或通过在页面上放置的Flash文件进行仿真)。


不幸的是,我需要支持当前和可能的旧版浏览器。不过这绝对值得进一步研究。谢谢! - Derek
1
这就是闪光适配器的作用。 - Will

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