如何显示连续的实时更新,如Facebook的股票,meetup.com主页呢?

如何显示连续的实时更新浏览器,如Facebook的股票,meetup.com主页呢? 在python,PHP,node.js和在服务器端的性能影响是什么? 如果页面被像akamai这样的CDNcaching,我们又怎么能实现同样的更新呢?

你有两个select(其他人在上面详细说明)。 如果你不熟悉每个选项背后的一些概念思想,我想我会给他们一两行。 请注意,我正在非常非常高的层次上介绍这些概念。

你的三个select是:

  1. 短轮询
  2. Web Socket
  3. 彗星/长轮询

短轮询

短轮询通过强制客户端不断向服务器发送请求来克服Client-Server之间的单向通信:

Client: Do you have a message for me? Server: No. Client: (wait x seconds) Client: Do you have a message for me? Server: No. Client: (wait x seconds) Client: Do you have a message for me? Server: Yes. Here it is! Client: Yay! Client: (update message) 

代表客户的不断唠叨被称为“ 轮询” 。 为了实现这个结构,你需要设置你的服务器来监听来自客户端的轮询请求。 服务器还必须将这些消息存储在某个地方,以便在消息准备就绪时,服务器可以提供这些消息。 在一个非常简单的层面上,你的服务器需要:

  • 接受一般的networking请求
  • 接受轮询请求
  • 运行提取邮件的后台作业
  • 将这些消息存储在某个地方,以便在轮询请求进入时,服务器可以检查它们。

您还需要将这些轮询请求与用户的某种会话ID绑定,以便将正确的消息传递给合适的人员。 总的来说,范式是复杂的,在我看来,效率低下。

Web套接字

Web套接字是HTML5的新function。 它们背后的基本思想是客户端可以保持与服务器的直接连接,并且可以互相推送信息。 因此,而不是通常的:客户端发送GET请求>>服务器响应与内容,networking套接字让您保持连续的对话。

然而,为了设置这个,你需要:

  • 符合WebSocket的浏览器(不是全部)。
  • 一个服务器可以处理networking套接字(不知道如何阐明这一点,但并不是所有的服务器都是为这种安排而设置的)。

这个设置有点复杂,虽然比长轮询更简单:

  • 客户端保持与到服务器的启用Web Socket连接的连接
  • 服务器通过Web套接字结果送给客户端
  • 客户端根据结果更新页面

你会看到这种模式被称为推送通知 (当然,如果你拥有一个你经历过的iPhone),因为服务器已经被授权 “东西” 送给客户端(多么不礼貌!)。 由于有很多客户端和服务器的细微差别,我build议testing出类似Pusher的东西,它基本上是一个Web服务来处理Web Sockets的所有硬件部分。 在开始设置之前,这将是一个简单的方法来testing和玩这个模式。 它有客户端和服务器端的库。

希望这些信息为您解决问题提供了基准。 其他答案有更直接的信息如何解决每个场景。

彗星/长轮询

对于Web Sockets来说,另一种看似是跨浏览器的方法是Long-Polling(参见Comet )。 在这种情况下,客户端build立到服务器的连接并挂起,等待数据被推回。 这个设置有些复杂,但它确实代表了Short PollingWeb Sockets之间的中间地带。

我build议使用SockJS或Socket.io作为客户端JavaScript库来实现一个类似于连接的套接字,然后在服务器端使用Tornado将任何状态更改发布到客户端。 代码非常简单。

客户端代码取决于您select的库。 SockJS或SocketIO。 或者,如果您只是想直接使用Websockets,则非常简单:

 update_socket = new WebSocket("ws://my_server.com/listening_url"); update_socket.onmessage = function (evt) { $("#my_div").html(evt); }; 

服务器端代码也很简单:

 import tornado class UpdateHandler(tornado.websocket.WebSocketHandler): def open(self): self.write_message('Hi client') # listen for some events that are occurring for message in function_that_generates_events(): self.write(message) def on_message(self, message): # Do something with incoming messages def on_close(self): # tidy up app = tornado.web.Application(('r/listening_url',UpdateHandler)) app.listen(9000) 

你可以使用民意调查,长期民意调查或者如果你想要一个推送系统。 最简单的将是一个民意调查。 但是,所有解决scheme都需要客户端编码。

性能影响取决于您的解决scheme。 最容易实施将是一个民意调查。 一个频率很低的调查确实有效地提出了一个要求,比如100ms模拟实时。 长期民意调查的影响较小,但在多多lessless的时间内仍会有很多要求。

docker

Ajax推送引擎

Socket.io

这些是实施彗星的方法

我会推荐使用Node.js实现的Socket.io

因为它利用了最好的可用连接方法