一、概述
push stream模块允许三种模式的订阅者:
[list]
[*]longpolling:每收到服务端响应数据即断开连接然后迅速重连,连接耗时可以忽略
[*]stream:与服务端保持长连接,持续不断的请求->响应
[*]polling:以轮询的方式向等待服务端响应(只接受一次数据)——[color=red](个人理解)[/color]
[/list]
本文重点说明前两种。
二、流程
上一篇博文中捎带提到了订阅者的销毁时间——发送完MSG后(ngx_http_push_stream_send_response_finalize),本文将详细说明其讲解其诞生过程。
[img]http://dl.iteye.com/upload/attachment/616219/f25b7ab3-3064-37fa-8434-d95b1dd4ec7a.png[/img]
从上述流程可以看出模块对longpolling和stream两种请求的处理方式有相同之处,也有少许不同。
相同之处主要体现在当所订阅的channel中不存在消息时,都执行下述流程:
[list]
[*]准备连接处于保存状态(subscriber_prepare_request_to_keep_connected)
[img]http://dl.iteye.com/upload/attachment/612131/e3f28304-594e-32dc-b807-0115c1c0da2e.png[/img]
[color=red] 可以看出,在此流程中订阅者诞生[/color]
[*]发送相同的响应头
[*]注册订阅者
将订阅者添加到ngx worker的订阅者队列,启动ping定时器和disconnect定时器等
[*]将订阅者添加到所订阅的channel上
[/list]
[code]
ngx_queue_insert_tail(&channel->workers_with_subscribers.queue, &worker_sentinel->queue);
[/code]
不同的是当channel中存在消息时,stream模式仍执行上述流程(建立长连接)然后获取MSG,而longpolling则直接从channel中取得MSG。
push stream模块允许三种模式的订阅者:
[list]
[*]longpolling:每收到服务端响应数据即断开连接然后迅速重连,连接耗时可以忽略
[*]stream:与服务端保持长连接,持续不断的请求->响应
[*]polling:以轮询的方式向等待服务端响应(只接受一次数据)——[color=red](个人理解)[/color]
[/list]
本文重点说明前两种。
二、流程
上一篇博文中捎带提到了订阅者的销毁时间——发送完MSG后(ngx_http_push_stream_send_response_finalize),本文将详细说明其讲解其诞生过程。
[img]http://dl.iteye.com/upload/attachment/616219/f25b7ab3-3064-37fa-8434-d95b1dd4ec7a.png[/img]
从上述流程可以看出模块对longpolling和stream两种请求的处理方式有相同之处,也有少许不同。
相同之处主要体现在当所订阅的channel中不存在消息时,都执行下述流程:
[list]
[*]准备连接处于保存状态(subscriber_prepare_request_to_keep_connected)
[img]http://dl.iteye.com/upload/attachment/612131/e3f28304-594e-32dc-b807-0115c1c0da2e.png[/img]
[color=red] 可以看出,在此流程中订阅者诞生[/color]
[*]发送相同的响应头
[*]注册订阅者
将订阅者添加到ngx worker的订阅者队列,启动ping定时器和disconnect定时器等
[*]将订阅者添加到所订阅的channel上
[/list]
[code]
ngx_queue_insert_tail(&channel->workers_with_subscribers.queue, &worker_sentinel->queue);
[/code]
不同的是当channel中存在消息时,stream模式仍执行上述流程(建立长连接)然后获取MSG,而longpolling则直接从channel中取得MSG。