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