EventSource 与轮询 ajax 的效率/开销?
Posted
技术标签:
【中文标题】EventSource 与轮询 ajax 的效率/开销?【英文标题】:Efficiency / overhead of EventSource vs polled ajax? 【发布时间】:2012-01-09 05:06:34 【问题描述】:我正在编写一个简单的应用程序,它在使用方面与聊天应用程序非常相似。主持人启动一个“房间”,参与者可以加入该房间并向该房间发送消息。
我试图让代码尽可能简单。后端的 php 没有任何花哨的东西。
我的第一个想法是从客户那里进行轮询 ajax,以查看房间中是否发布了新消息。然后我认为这会导致向服务器发出大量请求(尽管它们很小,但仍然如此)。
然后我研究了更多的 html5 方法并发现了 EventSource - 这在理论上似乎是正确的,但我想知道它在幕后只是轮询 ajax。
然后是彗星,但它也需要一个我不太急于设置的服务器端组件。
我想我可以使用长轮询 - 这是最好的方法吗?
另外,您如何最大限度地减少来自所有请求新数据的客户端的数据库请求?
【问题讨论】:
【参考方案1】:我认为短轮询是最简单的代码,但它可能会在服务器上产生不必要的负载。
长轮询效率更高,但您必须拥有能够有效支持多对多连接的服务器(即不是 Apache)。
是的,EventSource 只是一个美化的长轮询,但使用起来很愉快。
回答您的第二个问题:尽量减少数据库请求数量的最佳方法是不发出数据库请求。例如,将内容放入 memcached 中。
【讨论】:
但 EventSource 默认每 3 秒轮询一次。我知道你可以改变那个时间,但我认为长轮询的想法是你设置一个请求,它只是等到有数据 - 你如何使用 eventsource 做到这一点? 否,EventSource 每 3 秒尝试一次重新连接。如果您不关闭连接,它将立即获得更新。 您的意思是当它们可用时持续?不关闭该连接有什么缺点吗? @MichaelDrob:当然有。您必须保持连接打开! :-) 大多数服务器根本不是为此而设计的。在大多数情况下,使用 Apache 为您的页面提供服务并使用 Node.js 之类的东西来处理长轮询是有意义的。 我在 Dreamhost 上运行,所以我不认为 node js 是一个选择 - 而且,它增加了我的复杂性【参考方案2】:Sergio 为 EventSource 问题提供了一个很好的答案。他还指出,Apache 无法扩展以处理多对多同时/并发连接。 Apache 上的 PHP 有这个问题 - 特别是如果您使用共享主机。
PHP 的最佳解决方案是将实时网络通信和消息分发外包。您可以使用 self hosted realtime web solution... 自己完成此操作。
然后是彗星,但它也需要一个我不太急于设置的服务器端组件。
但听起来你并不热衷于设置它。因此,您最好的选择是使用 WebSockets 的托管实时 Web 解决方案,例如 Pusher(我的工作人员)。通过使用这样的服务,您将实现您的聊天应用程序,如下所示:
当用户加入房间时,他们订阅了chat-channel
。该名称可以特定于对话主题,例如chat-fishing
(更多频道信息here)
当用户提交聊天消息时,您的服务器会收到该消息(可能通过 AJAX 请求)
您将使用这条新消息更新您的数据库
一旦数据库成功更新,您就可以通过在chat-channel
频道上触发new_message
事件来将该消息分发(广播)给同一聊天室中的每个用户。这是通过使用 PHP library 的托管服务 RESTful API 完成的(它包含 RESTful API 所需的任何功能,例如身份验证)。
已连接的客户端收到消息。
tech example in this presentation 应该展示我们外包消息分发的好处。
有一个关于how to build a chat application using PHP with Pusher on Nettuts+的很好的教程。
尽管此解决方案/答案非常以 Pusher 为中心,但概念(外包利益、订阅、渠道和事件)适用于所有支持实时客户端推送的 realtime hosted services。
【讨论】:
有趣的解决方案。我希望免费做到这一点,至少在不久的将来 - 或者不超过我现在为托管支付的费用,我不认为 DH 做任何实时托管......很高兴了解这些东西不过 - 谢谢!以上是关于EventSource 与轮询 ajax 的效率/开销?的主要内容,如果未能解决你的问题,请参考以下文章