Hello!
2014/1/13 nikua...@gmail.com:
> 如题,要实现一个完全异步的二进制的后端,通过头部的ID字段来标识是哪个request的response,用tcpsocket实现,但是Response异步回来后怎么能触发原来的请求处理逻辑呢?
>
这种 TCP 连接内的多路复用协议或许可以这么实现:
1. 在 init_worker_by_lua 里创建一个长时间在背景中运行的 ngx.timer thread,由这个轻线程代理当前
worker 进程服务的所有下游请求到后端的请求。
2. 各个下游请求的处理程序所在的“轻线程”通过 ngx.semaphore API(或者 ngx.mutex API)进行“轻线程”间的同步。
3. 由于这些“轻线程”都位于同一个进程空间里,所以也位于同一个 Lua VM 空间里(除非禁用了
lua_code_cache),因此轻线程间的数据传递可以直接通过 Lua 值(但我们不能直接在不同请求或上下文之间直接传递
cosocket 对象)。
貌似现在 ngx_lua 就缺一个 ngx.semaphore API 了 :) 你有兴趣贡献补丁不?
Best regards,
-agentzh