ngx-push-stream模块源码学习(一)——序言

时间:2021-01-07 15:39:06

一、概述 
    与传统的request-response的web应用模式不同,comet是一种长连接(long-held)的应用模式,从而允许服务端主动向客户端推送数据。 
    主流的comet技术主要有以下两个分支:

分类 描述
streaming 客户端和服务器端保持一种长连接
long polling 客户端与服务器端建立连接后,以轮询方式等待服务器端数据或事件。收到服务端数据或连接超时后,断开连接并迅速再次建立连接

ngx-push-stream模块是ngx的一个第三方扩展模块,可以同时支持stream和long polling两种comet技术,基于该模块可以较容易使用nginx server push。 
    
二、模型 
    一种典型的模型如图所示: 
ngx-push-stream模块源码学习(一)——序言 
    基于ngx+ngx-push-stream模块可以实现在nginx服务器上扩展出两类终端:一种用于发布,一种用于订阅。订阅者以stream或long polling的方式向nginx channel请求数据;同时,发布者可可将信息以post的方式发送到nginx channel。ngx-push-stream模块则完成二者之间的信息缓存和中转。 
三、总体流程 
    简单来讲,整个发布订阅过程完成两项工作:

  • 向服务器推送MSG,服务端暂存MSG
  • 服务器端向订阅者推送MSG

为了完成上面两项工作,通道(channel)应运而生。它是发布者和订阅者之间的桥梁。发布者将MSG以post的形式发送到某个通道上,订阅者则以GET的方式从channle获取MSG。由此channel的重要性可见一斑。 
     通道的发布者一侧,支持http POST(发布信息)、DELETE(删除channel)和GET(获取channel信息)三种请求;订阅者一侧则只接受GET请求以获取最新MSG。具体来讲,发布者一侧主要完成以下三种功能:

    • 获取channle信息
    • 订阅者数目、缓存信息数目、已发送信息数目等等。。

    • 删除channel
    • 清空缓存的信息、通知所有的订阅者、释放channel

    • 发布信息
    • 将信息发布到channel上,并向订阅者中转