Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 客户端通知,我应该使用AJAX推送还是轮询?_Javascript_Ajax_Web Services_Server Push - Fatal编程技术网

Javascript 客户端通知,我应该使用AJAX推送还是轮询?

Javascript 客户端通知,我应该使用AJAX推送还是轮询?,javascript,ajax,web-services,server-push,Javascript,Ajax,Web Services,Server Push,我正在开发一个简单的通知服务,用于向浏览网站的用户发送消息。通知不必实时发送,但如果通知发生的频率高于每5分钟一次,则用户体验可能会更好。向客户机发送和从客户机发送的数据不是很大,检索数据是一个直接的数据库查询 在阅读关于该主题的其他对话时,似乎AJAX推送会导致更高的服务器负载。因为我可以忍受更长的服务器延迟,所以让服务器推送通知或简单地轮询是值得的 实现推送场景并不难,所以我想我会看到这里的观点 谢谢你的帮助 编辑: 我研究了一个简单的AJAX推送,并在此基础上实现了Mike Purvis的

我正在开发一个简单的通知服务,用于向浏览网站的用户发送消息。通知不必实时发送,但如果通知发生的频率高于每5分钟一次,则用户体验可能会更好。向客户机发送和从客户机发送的数据不是很大,检索数据是一个直接的数据库查询

在阅读关于该主题的其他对话时,似乎AJAX推送会导致更高的服务器负载。因为我可以忍受更长的服务器延迟,所以让服务器推送通知或简单地轮询是值得的

实现推送场景并不难,所以我想我会看到这里的观点

谢谢你的帮助

编辑: 我研究了一个简单的AJAX推送,并在此基础上实现了Mike Purvis的一个简单演示。 对于初始版本,客户端负载相当低,约为5k,并且预计将在相当长的一段时间内保持这种状态



谢谢大家的回复。我决定使用轮询解决方案,但将其全部封装在一个实用程序库中,这样以后如果他们想更改它,就更容易了。

我会实现轮询,因为它听起来更容易编写,保持简单非常有价值。

不确定您是否看过一些COMET实现(这就是您所说的AJAX推送的意思)


如果用户在网站上冲浪,这实际上不是在向服务器请求信息,而该通知可以利用这些信息吗?

因为使用推送需要在您的服务器和每个客户端之间维护一个开放的HTTP连接,所以我也会进行轮询-这不仅会消耗大量服务器资源,而且会增加成本正如matt b所提到的,实现起来也要复杂得多

我的轮询经验是,如果您在一个足够繁忙的站点上有足够频繁的轮询间隔,那么您的web服务器日志很快就会被轮询请求淹没


编辑(2017):我想说你现在的选择是在WebSocket和长轮询之间(在另一个答案中提到)。根据问题中提到的不需要实时接收通知的方式,长时间轮询可能是正确的选择,不频繁的轮询周期很容易实现,并且不会对服务器造成太大负担。WebSocket很酷,是当今许多应用程序的一个不错的选择,听起来不是不过,在这种情况下,这可能有点过头了。

我自己也没有尝试过,但有人说。还有一个名为Ruby on Rails的插件,我听过很多人谈论过。同样,我没有使用过它,所以是YMMV,但我的理解是,与轮询相比,它需要的资源要少得多。我相信(有人能证实吗?)COMET就是如何提供WWDC Stevenotes的实时博客的。

如果不知道您将拥有多少客户端,就无法确定轮询是否比推送更昂贵。我建议轮询,因为:

  • 听起来你想大约每分钟更新一次数据。除非通知能够以比这快得多的速度到达,否则推送将意味着你保持HTTP连接打开,但几乎看不到任何活动
  • 轮询是建立在现有HTTP约定之上的,因此任何与web浏览器对话的服务器都已经准备好响应普通的Ajax请求。基于Comet或Flash socket的解决方案有不同的要求;您需要在服务器端使用类似于Comet的东西,以及一个用于搜索服务器端推送的客户端库。

因此,如果您需要一些繁重的任务来管理大量的数据和大量的客户端,我建议您使用Comet。但事实似乎并非如此。

两者都有不同的要求和解决不同的场景

如果您需要实时更新,如在线聊天,推送是必须的

但是,如果刷新周期很大,就像您的情况一样(5分钟),则池是合适的解决方案。在这种情况下,推送将需要来自客户端和服务器的大量资源


提示!尝试使检查池的页面快速干净,这样就不会在每个请求中消耗服务器中的大量资源。我通常做的是在内存中保留一个标志(如会话变量中)也就是说,如果池是空的或不是空的…所以,我只在池不是空的情况下才查看池。当池是空的时,大多数情况下,页面请求运行得非常快。

肯定要使用push,它要冷得多。如果你只需要简单的通知,我会使用类似的东西来帮你完成繁重的工作。开发哟你自己的Ajax推送功能是一条非常棘手和艰难的道路-你必须让它在所有浏览器中工作,然后处理防火墙和代理,杀死保持活动的连接等等。为什么要重新发明轮子呢。此外,它的占地面积同样低,不到10K,因此如果这是你的优先事项,它应该适合你。

现在有了一项服务这正试图在一瞬间彻底解决此问题。可能值得一试。(免责声明:我与他们毫无关联)。

我很惊讶这里没有人提到长轮询。长轮询意味着保持连接更长时间(比如30-60秒),一旦关闭,重新打开它,只需让套接字/连接侦听响应。这会导致连接减少(但更长),并意味着响应几乎是即时的(有些可能需要等待新的轮询连接)。我想补充一点,与NodeJS等技术相结合,这将产生一个非常高效且资源充足的解决方案,该解决方案在所有主要浏览器和版本中都是100%兼容的,并且不需要任何添加