MQ
MQ库
MQ库是CF框架针对httpd的Websocket路由实现的一种订阅发布库.
众所周知: 客户端在使用Websocket协议与服务端进行通信的情况下, 服务端需要主动推送必须处于一种'定时器/订阅'的状态才能主动触发推送消息到客户端.
MQ借用Redis/MQTT的subscribe与publish实现此种功能.
MQ:new(opt)
opt.host
MQ Broker的主机名或IP地址.
opt.port
MQ Broker的主机端口号.
opt.type
MQ Broker的类型(redis/mqtt).
opt.auth
MQ Broker(redis类型专有)用于redis broken验证.
opt.username/password
MQ Broker(mqtt类型专有)用于username/password验证.
此方法返回一个MQ实例.
MQ:on(pattern, function handle(msg) end)
pattern
string类型, 用来指定订阅的位置;
handle
function类型, 订阅消息到回调处理函数;
msg
table类型, 消息根据不同类型broker各有差异;
这里根据script/ws.lua
文件精简之后给出一段代码示例:
local MQ = require "MQ"
local class = require "class"
local websocket = class("websocket")
function websocket:ctor(opt)
self.ws = opt.ws -- websocket对象
self.mq = MQ:new({host = 'localhost', port = 6379, type = 'redis'})
end
function websocket:on_open()
self.mq:on('/test/*', function (msg) -- 消息队列
if not msg then
self.ws:send('{"code":500,"message":"无法连接到mq broker(redis)"}')
return self.ws:close()
end
self.ws:send('{"code":200}')
end)
end
此方法返回true表示订阅成功, 但情况下可忽略. msg为nil的情况下说明mq broker已经断开连接.
MQ:emit(pattern, data)
pattern
string类型, 用来指定data所需要发布到的订阅位置;
data
string类型, 需要发布的消息;
--- 代码示例
local ok = MQ:emit('/test/admin', '{"code":200}')
此方法返回true表示发布成功, 但是不要过于依赖返回值. 因为MQ内置断线重连机制, 因为网络异常等原因可能会很久才会返回.
MQ:close()
此方法用来正确关闭MQ的发布与订阅.
如果使用者将MQ用在websocket, 需要关闭时应该在websocket的on_close方法关闭(推荐)
如果用在其它地方, 请仔细调试过后再试用. 作者不保证在websocket以外的地方能正常(正确)工作.
此方法没有返回值.
最后
有小伙伴对websocket长连接有兴趣的可以下载cf发布在docker hub上的容器体验一下, 使用chrome的websocket客户端插件(smart websocket client)就可以对接查看效果.
MQ库是因为为对接第三方协议(gRPC等)平台而自己创建的一种消息通讯方式. 很多使用者因为自行定制化协议, 所以CF作者用MQ示例来作为一种最直观的对接方式.
更多建议: