长轮询和服务器行为

Posted

技术标签:

【中文标题】长轮询和服务器行为【英文标题】:Long Polling And Server Behavior 【发布时间】:2013-10-25 07:42:06 【问题描述】:

虽然在 php 上工作了这么久,但最近才知道长轮询,否则我会定期发送 ajax。

据了解,发送周期性 ajax 会消耗带宽(考虑网站有数千个用户的情况)。此外,服务器仍然忙于处理定期 ajax 请求。

长轮询的优点是它极大地减少了带宽,因为只有在发生变化时才会响应 ajax,除非 ajax 保持打开状态。然而,服务器需要继续工作(直到发生错误情况之前的那种 while 循环),直到发生一些变化。

我的问题是,在这种技术中,服务器必须承受负载。有成千上万的用途,它不会影响周期性ajax的说方式吗?

对不起,如果我错了。

【问题讨论】:

看看这个:***.com/questions/15724055/long-polling-really 【参考方案1】:

当您说“负载”时,让我们考虑带宽、CPU 时间和其他资源。

带宽

如您所说,周期性 ajax 会消耗带宽。每次轮询都会有一个 HTTP 请求-响应对,即使来自服务器的响应基本上是空的。通过长轮询,服务器不会响应,除非它有话要说。这是您节省带宽的地方。

CPU

如果您的长轮询实现在服务器端使用 sleep(),它不会使用很多 CPU 周期。

对于 PHP:

http://php.net/manual/en/function.sleep.php http://php.net/manual/en/function.usleep.php

请注意,一般来说,您应该在任何时候想要延迟软件时使用类似 sleep() 的函数。不要使用没有 sleep() 的紧密循环来实现定时延迟。

其他

根据您的服务器配置,每个活动用户可能会使用一个进程或线程。即使在睡眠时,这个进程或线程也会消耗一些资源,包括任何分配的内存。除非您正在谈论大量同时用户,或者您的应用程序在每个用户的服务器上使用大量内存,否则您不太可能遇到硬件限制。您可能首先遇到线程或进程数的软配置限制。

因此,如果您的应用程序为每个活动用户占用大量内存,那么长轮询 可能 使您的内存受限,而不是定期 AJAX 实现,后者为每个 ajax 分配和取消分配资源打。有了好的设计,这应该不是问题。

【讨论】:

@bas,首先谢谢你。 CPU:不要使用没有 sleep() 的紧密循环来实现定时延迟。 这是否意味着 while($condition) sleep(10);// $condition = some logic ?其次,当长极xhr消耗一些资源时,它们将一直被线程占用,直到服务器响应。现在,如果长杆 xhr 来自其他用户的相同资源怎么办?比赛条件?死锁对吧?那么??? 是的,你写的while循环就是我的意思。死锁和竞争条件是一个不同的问题。这取决于正确实现线程/进程之间的资源锁定。如果你实现了正确的锁定,你应该避免争用问题,但要注意临界区(资源被锁定的地方)可能会成为你的应用程序的瓶颈,所以不要锁定资源超过必要的时间。 简而言之,与周期性 ajax 相比,长轮询可以有效地减少带宽,但会使服务器繁忙。考虑发送长轮询 xhr 并且服务器长时间没有响应的情况?它会让服务器忙吗? Facebook 是否对通知队列或 socket.io 使用长轮询? 我不同意与常规 ajax 相比,长轮询本质上会使服务器忙碌。一个糟糕的实现可能会这样做,但任何技术都是如此。我不知道 Facebook 用什么,但是 Socket.IO 可以使用多种底层方法。通常它使用 WebSocket,但当 WebSocket 不可用时可以回退到长轮询。当不支持像 WebSocket 这样更好的东西时,长轮询只是一种使用纯 HTTP 的技术。

以上是关于长轮询和服务器行为的主要内容,如果未能解决你的问题,请参考以下文章

轮询和长轮询

Tornado-长轮询_webSocket

长轮询和长连接

轮询长轮询和websocket

轮询长轮询和websocket

轮询与长轮询[关闭]