文章存档 » 五月 2012

消息推送系统——(一)概念与原理

这里我们从系统结构的层面来看消息推送系统(Push Server)的基本原理。

首先需要了解几个基本的概念:

HTTP长连接

翻译自http keep-alive connection和http persistent connection,又叫http connection reuse,网上也有反过来翻译成http long connection。

下面这个图来自wikipedia,讲解了http长连接是在一个TCP连接的基础之上,发送多个HTTP请求以及接收多个HTTP响应,这是为了避免每一次请求都去打开一个新的连接。在HTTP 1.1标准中,所有的请求都认为是长连接。

HTTP长连接图解

在这里的消息推送系统中,HTTP长连接的作用就是向服务器发送请求,然后一直等待服务器的返回数据。这就相当于客户端在“监听”服务器了,可以随时接收来自服务器的消息。OK,lolita is ready to be pushed!

同步与异步

同步:IO操作将导致请求进程阻塞,直到IO操作完成。也就是说客户端在发送请求后,必须得在服务端有回应后才发送下一个请求。

异步:IO操作不导致请求进程阻塞。也就是说客户端在发送请求后,不必等待服务端的回应就可以发送下一个请求。

同步与异步说的是客户端与服务器端之间的一种通信方式。

阻塞与非阻塞

阻塞:服务器端的线程或者进程没有处理完数据的时候,不会返回,线程或者进程回被挂起,不再响应其他请求。

非阻塞:服务器端在没有处理完的时候,会立即返回,不会挂起线程或者进程,可以继续响应其他请求。

阻塞与非阻塞说的是服务器端对请求的处理方式。

在消息推送系统中,客户端+服务器端一起,使用的是异步非阻塞。

消息推送系统(Push Server)的结构和原理

好了,接下来是就是消息推送系统(Push Server)的结构和原理了:

push-server-1

  1. 客户端发出一个http长连接请求,然后等待服务器的响应。这个请求是异步的,所以客户端可以继续工作,比如发起其他ajax请求等等。这个时候客户端就是一个待推倒的小萝莉了。
  2. 服务器接到请求之后,并不立即发送出数据,而是hold住这个connecton。这个处理是非阻塞的,所以服务器可以继续处理其他请求。
  3. 在某个时刻,比如服务器有新数据了,服务器再主动把这个消息推送出去,即通过之前建立好的连接将数据推送给客户端。
  4. 客户端收到返回。这个时候就可以处理数据,然后再次发起新的长连接。

基本原理就是这么简单。

但是在具体实现的时候,还有很多细节要处理,需要一些其他的技术。

下一篇会讲解客户端Javascript的实现,主要内容是HTTP长连接的建立和CORS在不同浏览器下的实现。

参考资料

原文链接

消息推送系统——(零)推倒萝莉之术

当一个初学Web开发的童鞋,产生让服务器“主动”给浏览器客户端发送数据的想法的时候,比他入门稍早的同学会说:

“这是Web!只能由浏览器发起请求,然后得到服务器返回的数据。”

可能接触得更多的童鞋会说:

“除非你用Javascript轮询/心跳,不断请求服务器看有没有新的数据。但是用户多了服务器会受不了。”

都没错。

但主动推送数据非是不可实现的。聪明的先驱们已经找到了更优的解决方案,那就是利用http长连接来实现消息推送系统。

消息推送系统又叫服务器推、Comet技术、Push Server、Server Push等等。它们的含义大同小异,只是从不同场景中得来的不同的称呼而已,具体可以google。我个人比较喜欢Push Server这个名称,很形象——用来向客户端push消息的这么一个server,就叫Push Server。

消息推送系统是一个很有魔力的技术,它实现了攻受的颠倒和权力的反转。服务器不用再傻乎乎地等待着客户端的请求才能发送最新的数据,而是占据了主动,当有新数据的时候,服务器可以立即主动地将数据push给相关的客户端。

想一想,这个时候,你就可以push消息指挥客户端的Javascript做任何事,所有用户的页面都是你的线控木偶了。话说萝莉有三宝,轻音柔体易推倒。Web相比传统软件来说,也算是轻音柔体的萝莉了,而这里的Push Server,也就是推倒萝莉之术了:P 。

推倒萝莉之后,可以做什么呢?当然是很fancy的事情了:

  • 在线好友列表
  • 在线聊天(聊天室、点对点,多人聊天)
  • 即时通知
  • 统计、监控在线用户
  • 实时内容更新

这里要讲的Push Server,是由Javascript + Python(Tornado) + Memcache实现的。但文章中会着重介绍实现原理,而非具体的代码。

Push Server主要包含以下几个方面:

  • http长连接
  • Javascript 的 CORS (The Cross-Origin Resource Sharing)与跨浏览器实现
  • 服务器异步响应
  • 客户端的链接与断开
  • 性能何如

后面的文章会慢慢解来。

原文链接