更快的轮询频率会让我的页面陷入困境吗?

时间:2012-03-23 18:01:49

标签: javascript polling

所以我有一个Rails应用程序(在这种情况下看起来似乎无关紧要,但无论如何我都会提到它)。这是一种聊天室应用程序。

为了告诉哪些用户当前在聊天室,我一直在使用Javascript轮询。

这么简单

$(function() {
    setTimeout(updateUsers, 15000);
});

其中updateUsers只是调用一个AJAX get请求来提取当前在聊天室中的用户数组。

这是我的问题:15秒是等待投票的很长时间。如果没有性能问题我应该多久一次?显然这取决于很多因素,但我想听听这些因素。我在聊天室中看到了一堆类似的问题,但是还没有用户列表,这就是我提出这个问题的原因。

3 个答案:

答案 0 :(得分:0)

任何更频繁的事情都会增加额外负载,尽管是服务器,客户端或两者兼而有之。

话虽如此,我并不认为那里有一个“甜蜜点”#34; (它似乎是你所指的)。但是,您可以查看Ruby Push API,它基本上保持连接始终打开,并仅在必要时发送数据。 (进一步搜索后,似乎也有Juggernaut plugin。)

答案 1 :(得分:0)

这取决于很多东西,比如你的基础设施,预期用户的数量等等。即使我们有这些数字,也很难说出什么是好的超时。

如果您只发送一个包含用户列表的简单JSON数组,我会说实验延迟3-5秒并从那里检查。这是一个过早优化的问题 - 你正试图解决你还没有的问题。

然而,还有另外两种可能的解决方案:

你只能发送差异。轮询时,会返回一条消息,说明自上次轮询以来哪些用户已连接以及哪些用户已离开。这需要某种服务器跟踪,但可以完成。

另一种解决方案是根本不使用轮询,并使用更现代的技术,如WebSockets / Long-polling。这些将允许服务器本身向您的客户发送消息。因此,您可以在连接时向他们发送初始列表,并在每次其他人连接/离开时向他们发送一条最小的消息。在节点环境中,这是一个很好的解决方案是Socket.IO。我不是一个Ruby人,所以我不知道是否有人做过类似的事情,但如果有人将整个事情移植到Rails,我也不会感到惊讶。搜索一下,我相信你会找到适合你需求的东西。

答案 2 :(得分:0)

我认为你应该有一些彗星技术

http://en.wikipedia.org/wiki/Comet_(programming))

或者添加一些查找平均响应时间并更改动态间隔的函数。也许服务器可以告诉客户“我有很多工作要做,请等待30秒直到下一次请求”。