ngx-push-stream模块源码学习(一)——序言
一、概述
与传统的request-response的web应用模式不同,comet是一种长连接(long-held)的应用模式,从而允许服务端主动向客户端推送数据。
主流的comet技术主要有以下两个分支:
| 分类 | 描述 |
| streaming | 客户端和服务器端保持一种长连接 |
| long polling | 客户端与服务器端建立连接后,以轮询方式等待服务器端数据或事件。收到服务端数据或连接超时后,断开连接并迅速再次建立连接 |
ngx-push-stream模块是ngx的一个第三方扩展模块,可以同时支持stream和long polling两种comet技术,基于该模块可以较容易使用nginx server push。
二、模型
一种典型的模型如图所示:
基于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上,并向订阅者中转
ngx-push-stream模块源码学习(一)——序言的更多相关文章
- ngx-push-stream模块源码学习(四)——订阅
一.概述 push stream模块允许三种模式的订阅者: longpolling:每收到服务端响应数据即断开连接然后迅速重连,连接耗时可以忽略 stream:与服务端保持长连接,持续不断的请求-&g ...
- nginx-push-stream模块源码学习(三)——发布
一.概述 发布:发布者将MSG post到某一特定通道上,channel将信息缓存 在说明发布流程之前有必要说明下channel和msg的数据结构. 二.数据结构 2.1 MSG 发布 ...
- nginx-push-stream模块源码学习(二)——模块初始化
本文重点介绍push stream模块的构成,至于nginx如何启动.维护该模块不会详细阐述,以后有时间会做详细阐述. 一.模块定义 1.1. 模块配置 通用nginx模块的配置struct有三种, ...
- ngx-push-stream模块源码学习(五)——内存清理
1.定时器 采用nginx自身的定时器管理机制,具体细节待学习过nginx源码后加以补充 2.channel的生成周期 (0).初始(诞生) 发布.订阅均有可能产生ch ...
- co模块源码学习笔记
// Sorrow.X --- 添加注释,注释纯属个人理解 /** * slice变量 引用 数组的 slice方法 */ var slice = Array.prototype.slice; /** ...
- 【 js 模块加载 】深入学习模块化加载(node.js 模块源码)
一.模块规范 说到模块化加载,就不得先说一说模块规范.模块规范是用来约束每个模块,让其必须按照一定的格式编写.AMD,CMD,CommonJS 是目前最常用的三种模块化书写规范. 1.AMD(Asy ...
- 【 js 模块加载 】【源码学习】深入学习模块化加载(node.js 模块源码)
文章提纲: 第一部分:介绍模块规范及之间区别 第二部分:以 node.js 实现模块化规范 源码,深入学习. 一.模块规范 说到模块化加载,就不得先说一说模块规范.模块规范是用来约束每个模块,让其必须 ...
- Hadoop源码学习笔记之NameNode启动场景流程一:源码环境搭建和项目模块及NameNode结构简单介绍
最近在跟着一个大佬学习Hadoop底层源码及架构等知识点,觉得有必要记录下来这个学习过程.想到了这个废弃已久的blog账号,决定重新开始更新. 主要分以下几步来进行源码学习: 一.搭建源码阅读环境二. ...
- 我的angularjs源码学习之旅2——依赖注入
依赖注入起源于实现控制反转的典型框架Spring框架,用来削减计算机程序的耦合问题.简单来说,在定义方法的时候,方法所依赖的对象就被隐性的注入到该方法中,在方法中可以直接使用,而不需要在执行该函数的时 ...
随机推荐
- 【百度地图API】如何利用地图API制作汽车沿道路行驶的动画?——如何获得道路层数据
原文:[百度地图API]如何利用地图API制作汽车沿道路行驶的动画?--如何获得道路层数据 有几个做汽车导航的朋友问我说,他们想在地图上制作一辆车沿着道路行驶的动画.可是,百度地图的道路数据并没有公开 ...
- MVC使用百度开源文本编辑器UEditor实现图文并茂,字数限制,上传图片或涂鸦
原文:MVC使用百度开源文本编辑器UEditor实现图文并茂,字数限制,上传图片或涂鸦 文本编辑器有很多,比如ticymce和CKEditor就比较好用,但涉及到图片.文件上传,需要结合CKFinde ...
- 聊聊单元測试(一)——EasyMock
一.单元測试是保证软件质量的重要方法. 单元測试是对系统中某个模块功能的验证,但我们总会遇到这样那样的问题,导致測试代码非常难编写.最直接的一个原因便是强耦合关系,被測试者依赖一些不easy构造,比較 ...
- 如何使用linq操作datatable进行分组
使用微软.net的孩子们应该都知道linq吧,要知道linq可是其他高级语言没有的技术,比如php,java等等,但是起初我对linq的认识只是停留在对 list<> 的泛型集合进行操作, ...
- iframe的各项參数
iframe的各项參数: <iframe src="test.jsp" width="100″ height="50″ frameborder=" ...
- Hack 语言学习/参考---1.2 Hack Background
Hack Background Facebook was initially built with PHP. Parameters and return types were specified in ...
- JS对text非空判断,非空校验
function JTrim(s){ return s.replace(/(^\s*)|(\s*$)/g, "");} //你先调用一下这个方法,然后在判断 function ...
- SAE设置记录:修改config.yaml实现地址重写和修改固定链接
刚搭建完sae博客后闲置下来了,偶尔写两篇文章,最近想整理整理sae,于是开始. 刚新建完博客修改固定链接,可是保存后直接访问出现问题,访问不到文章了,而且我的博客地址前面会出现"1.&qu ...
- 设计与实现的简单和经常使用的权限系统(五岁以下儿童):不维护节点的深度level,手工计算level,树形结构
以这种方式.和第三的类似介绍.所不同的是.深度未在数据库中存储节点level,添加和更改时间,护.而是,在程序中,实时去计算的. 至于后面的,依照level升序排序,再迭代全部的节点构造树,与第三篇 ...
- 【转】Android的Merge讲解与实例
原文:http://blog.sina.com.cn/s/blog_62f987620100sf13.html 单独将<merge />标签做个介绍,是因为它在优化UI结构时起到很重要的作 ...