一、概述 
push stream模块允许三种模式的订阅者:

  • longpolling:每收到服务端响应数据即断开连接然后迅速重连,连接耗时可以忽略
  • stream:与服务端保持长连接,持续不断的请求->响应
  • polling:以轮询的方式向等待服务端响应(只接受一次数据)——(个人理解)

本文重点说明前两种。 
二、流程 
上一篇博文中捎带提到了订阅者的销毁时间——发送完MSG后(ngx_http_push_stream_send_response_finalize),本文将详细说明其讲解其诞生过程。

从上述流程可以看出模块对longpolling和stream两种请求的处理方式有相同之处,也有少许不同。 
相同之处主要体现在当所订阅的channel中不存在消息时,都执行下述流程:

    • 准备连接处于保存状态(subscriber_prepare_request_to_keep_connected)

可以看出,在此流程中订阅者诞生

  • 发送相同的响应头
  • 注册订阅者
  • 将订阅者添加到ngx worker的订阅者队列,启动ping定时器和disconnect定时器等

  • 将订阅者添加到所订阅的channel上
  1. ngx_queue_insert_tail(&channel->workers_with_subscribers.queue, &worker_sentinel->queue);

不同的是当channel中存在消息时,stream模式仍执行上述流程(建立长连接)然后获取MSG,而longpolling则直接从channel中取得MSG。

ngx-push-stream模块源码学习(四)——订阅的更多相关文章

  1. nginx-push-stream模块源码学习(三)——发布

    一.概述     发布:发布者将MSG post到某一特定通道上,channel将信息缓存 在说明发布流程之前有必要说明下channel和msg的数据结构. 二.数据结构 2.1 MSG     发布 ...

  2. nginx-push-stream模块源码学习(二)——模块初始化

    本文重点介绍push stream模块的构成,至于nginx如何启动.维护该模块不会详细阐述,以后有时间会做详细阐述. 一.模块定义 1.1.  模块配置 通用nginx模块的配置struct有三种, ...

  3. ngx-push-stream模块源码学习(五)——内存清理

    1.定时器         采用nginx自身的定时器管理机制,具体细节待学习过nginx源码后加以补充 2.channel的生成周期 (0).初始(诞生)         发布.订阅均有可能产生ch ...

  4. [spring源码学习]四、IOC源码——普通bean初始化

    一.代码例子 此节开始涉及到一个bean具体生成和保存的过程,仅仅涉及到最简单的bean,代码依旧是最简单的 public static void main(String[] args) { Defa ...

  5. dubbo源码学习(四):暴露服务的过程

    dubbo采用的nio异步的通信,通信协议默认为 netty,当然也可以选择 mina,grizzy.在服务端(provider)在启动时主要是开启netty监听,在zookeeper上注册服务节点, ...

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

    一.概述     与传统的request-response的web应用模式不同,comet是一种长连接(long-held)的应用模式,从而允许服务端主动向客户端推送数据.     主流的comet技 ...

  7. co模块源码学习笔记

    // Sorrow.X --- 添加注释,注释纯属个人理解 /** * slice变量 引用 数组的 slice方法 */ var slice = Array.prototype.slice; /** ...

  8. mybatis源码学习(四)--springboot整合mybatis原理

    我们接下来说:springboot是如何和mybatis进行整合的 1.首先,springboot中使用mybatis需要用到mybatis-spring-boot-start,可以理解为mybati ...

  9. MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)

    前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...

随机推荐

  1. typecheck()简析

    #define typecheck(type,x) \ ({ type __dummy; \ typeof(x) __dummy2; \ (void)(&__dummy == &__d ...

  2. TRS_WCM(拓尔思信息技术有限公司)内容协作平台平台置标经验攻略

    TRS_WCM置标过程中经验积累 版本V4.0-2014.6.24-穿越者7号 目录 1.嵌套模板置标 1 2.栏目名称超链接置标 1 3.列表循环输出文档标题包含超链接 1 4.取既定栏目下第一篇文 ...

  3. 了解ASP.NET 5

    通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(1) 微软在开发ASP.NET 5(当时被称为ASP.NET vNext)是采用的代号为Project K,所以运行时被称为 ...

  4. div、ul、li等无法居中问题,text-align无效 margin auto无效

    很简单.如果是div,直接把div换成: <table align="center">        <tr>            <td> ...

  5. 在linux中如何调试C语言程序

    在Linux下面可以使用下面几种形式对C语言进行调试: 1 gdb gdb program 这是最原始的调试方法,若非熟悉命令行,这种方式其实是比较麿人的.有兴趣的可以参考一些我之前的博文.http: ...

  6. Servlet配置load-on-startup

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:// ...

  7. 九度OJ 1035:找出直系亲属(二叉树)

    题目1035:找出直系亲属 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1309 解决:521 题目描述: 如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如 ...

  8. 02.零成本实现WEB性能测试-基于APACHE JMETER

    书评: 1.这本是介绍性能测试工具Jmeter的书籍,维度还够,但是粒度太粗. 2.对于想快速了解JMeter的使用和工具的原件使用,还是有一定的参考价值. 3.实际上,这本书可用来快速入门,掌握和了 ...

  9. validate的使用

    日期和时间验证或者按照指定的格式进行验证,或者使用的标准格式指定的区域设置. 日期验证 - 验证日期转换为java.util.Date的类型. 日历验证 - 验证日期转换为java.util.Cale ...

  10. sql汉字转拼音

    /*创建取拼音首字母函数*/ create function [dbo].[fn_ChineseToSpell](@strChinese varchar(500)='') returns varcha ...