多请求同时复用一个TCP长连接(pipeline)问题

389 views
Skip to first unread message

陶鹏飞

unread,
May 25, 2015, 2:34:41 AM5/25/15
to open...@googlegroups.com
请问: Nginx_HTTP_Lua是否支持在后台维护一条TCP长连接,多个客户端的请求到来后,消息经转换后通过一条TCP长连接把多个请求发给后台服务器(pipeline方式),当收到后台服务器的响应后消息,经处理后找到相应的原始请求,把响应消息回复给相应的客户端?

当前ngx_http_lua支持后台长连接复用,但一条长连接不能同时被多个不同客户端的多个请求复用。

Yichun Zhang (agentzh)

unread,
May 28, 2015, 9:43:23 AM5/28/15
to openresty
Hello!

2015-05-25 14:34 GMT+08:00 陶鹏飞:
> Nginx_HTTP_Lua是否支持在后台维护一条TCP长连接,多个客户端的请求到来后,消息经转换后通过一条TCP长连接把多个请求发给后台服务器(pipeline方式),当收到后台服务器的响应后消息,经处理后找到相应的原始请求,把响应消息回复给相应的客户端?
>
> 当前ngx_http_lua支持后台长连接复用,但一条长连接不能同时被多个不同客户端的多个请求复用。
>

我记得这个话题在本列表里讨论过多次了。再重复一下我的建议:

1. 使用 ngx.timer.at + init_worker_by_lua 让每个 nginx worker 进程保持一个背景“轻线程”
2. 在背景“轻线程”中保持一个到后端的长连接,同时负责当前 nginx worker 进程中所有下游请求的后台请求的统一发送和结果分发。
3. 每个下游请求通过 Lua 模块级别的变量 [1](作为“任务队列”)向当前 worker
的背景”轻线程“传递后台请求的数据,同时使用类似 lua-resty-lock 这样的库进行同步等待结果;
4. 背景”轻线程“从“任务队列”变量里取出新的请求数据,发送到 worker 级别共享的后台连接。
5. 背景“轻线程”读取后台连接的新响应数据,然后分发给对应的下游请求。

对于后台连接的读取和发送可以分别发生在背景“轻线程”创建的两个孩子“轻线程”中,毕竟 cosocket
支持全双工。当然,也不必真创建两个孩子“轻线程”,毕竟背景“轻线程”本身也可以作为其中的一个任务“轻线程”。

仅供参考 :)

或许后面得空了,我可以提供一个最小化的完整 demo,毕竟有不少用户都有这种需求 :)

Regards,
-agentzh

[1] https://github.com/openresty/lua-nginx-module#data-sharing-within-an-nginx-worker
Reply all
Reply to author
Forward
0 new messages