这里我们从系统结构的层面来看消息推送系统(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长连接的作用就是向服务器发送请求,然后一直等待服务器的返回数据。这就相当于客户端在“监听”服务器了,可以随时接收来自服务器的消息。OK,lolita is ready to be pushed!
同步与异步
同步:IO操作将导致请求进程阻塞,直到IO操作完成。也就是说客户端在发送请求后,必须得在服务端有回应后才发送下一个请求。
异步:IO操作不导致请求进程阻塞。也就是说客户端在发送请求后,不必等待服务端的回应就可以发送下一个请求。
同步与异步说的是客户端与服务器端之间的一种通信方式。
阻塞与非阻塞
阻塞:服务器端的线程或者进程没有处理完数据的时候,不会返回,线程或者进程回被挂起,不再响应其他请求。
非阻塞:服务器端在没有处理完的时候,会立即返回,不会挂起线程或者进程,可以继续响应其他请求。
阻塞与非阻塞说的是服务器端对请求的处理方式。
在消息推送系统中,客户端+服务器端一起,使用的是异步非阻塞。
消息推送系统(Push Server)的结构和原理
好了,接下来是就是消息推送系统(Push Server)的结构和原理了:
- 客户端发出一个http长连接请求,然后等待服务器的响应。这个请求是异步的,所以客户端可以继续工作,比如发起其他ajax请求等等。这个时候客户端就是一个待推倒的小萝莉了。
- 服务器接到请求之后,并不立即发送出数据,而是hold住这个connecton。这个处理是非阻塞的,所以服务器可以继续处理其他请求。
- 在某个时刻,比如服务器有新数据了,服务器再主动把这个消息推送出去,即通过之前建立好的连接将数据推送给客户端。
- 客户端收到返回。这个时候就可以处理数据,然后再次发起新的长连接。
基本原理就是这么简单。
原文转载于https://www.pureweber.com/article/push-server-principle/