欢迎大家一起来讨论下面这个话题。
由于与ngx 作为redis的一个client,端口限制等因素使得redis与ngx同机器部署,把unixsocket使用起来等,都是比较精彩的实现。
我现在的想法是把ngx_Lua与ngx的push stream module结合起来使用,lua来处理逻辑,如校验用户权限,保存讨论数据等等;push-stream-module来维持与client的长连接,负责新消息的推送。
这样做的好处是,lua层面不需要与redis等上游服务保持太多的链接。基本流程是这样的:
(只描述了基本的发、收信息的思想)
发送消息
location /pub
{
access_by_lua_file "/my_path/access.lua"; //access.lua里实现了鉴权,数据存储等操作
//这个是push-stream-module的配置
push_stream_publisher admin;
set $push_stream_channel_id $arg_id;
}
订阅消息(客户端请求这个地址成功后,会与ngx保持一个长连接,ngx也是通过这个连接来及时推送数据给对于的客户端)
location ~ /sub/(.*) {
{
access_by_lua_file "/my_path/access.lua"; //access.lua里实现了鉴权等操作
//这个是push-stream-module的配置
push_stream_subscriber;
set $push_stream_channels_path $1;
}
个人觉得ngx_Lua 与 push-stream-module结合起来使用是很不错的,
但是今天测试下来,发现ngx_Lua里一些很关键的功能不能与push-stream-module一起使用,如lua_check_client_abort + ngx.on_abort 来检查客户端是否断开等。这个尤其郁闷。。。(这个春哥给点建议?这个功能对我们来说还是很重要的)
欢迎大家一起来讨论下这样的架构....