MQ庫(kù)是CF框架針對(duì)httpd的Websocket路由實(shí)現(xiàn)的一種訂閱發(fā)布庫(kù).
眾所周知: 客戶(hù)端在使用Websocket協(xié)議與服務(wù)端進(jìn)行通信的情況下, 服務(wù)端需要主動(dòng)推送必須處于一種'定時(shí)器/訂閱'的狀態(tài)才能主動(dòng)觸發(fā)推送消息到客戶(hù)端.
MQ借用Redis/MQTT的subscribe與publish實(shí)現(xiàn)此種功能.
opt.host
MQ Broker的主機(jī)名或IP地址.
opt.port
MQ Broker的主機(jī)端口號(hào).
opt.type
MQ Broker的類(lèi)型(redis/mqtt).
opt.auth
MQ Broker(redis類(lèi)型專(zhuān)有)用于redis broken驗(yàn)證.
opt.username/password
MQ Broker(mqtt類(lèi)型專(zhuān)有)用于username/password驗(yàn)證.
此方法返回一個(gè)MQ實(shí)例.
pattern
string類(lèi)型, 用來(lái)指定訂閱的位置;
handle
function類(lèi)型, 訂閱消息到回調(diào)處理函數(shù);
msg
table類(lèi)型, 消息根據(jù)不同類(lèi)型broker各有差異;
這里根據(jù)script/ws.lua
文件精簡(jiǎn)之后給出一段代碼示例:
local MQ = require "MQ"
local class = require "class"
local websocket = class("websocket")
function websocket:ctor(opt)
self.ws = opt.ws -- websocket對(duì)象
self.mq = MQ:new({host = 'localhost', port = 6379, type = 'redis'})
end
function websocket:on_open()
self.mq:on('/test/*', function (msg) -- 消息隊(duì)列
if not msg then
self.ws:send('{"code":500,"message":"無(wú)法連接到mq broker(redis)"}')
return self.ws:close()
end
self.ws:send('{"code":200}')
end)
end
此方法返回true表示訂閱成功, 但情況下可忽略. msg為nil的情況下說(shuō)明mq broker已經(jīng)斷開(kāi)連接.
pattern
string類(lèi)型, 用來(lái)指定data所需要發(fā)布到的訂閱位置;
data
string類(lèi)型, 需要發(fā)布的消息;
--- 代碼示例
local ok = MQ:emit('/test/admin', '{"code":200}')
此方法返回true表示發(fā)布成功, 但是不要過(guò)于依賴(lài)返回值. 因?yàn)镸Q內(nèi)置斷線重連機(jī)制, 因?yàn)榫W(wǎng)絡(luò)異常等原因可能會(huì)很久才會(huì)返回.
此方法用來(lái)正確關(guān)閉MQ的發(fā)布與訂閱.
如果使用者將MQ用在websocket, 需要關(guān)閉時(shí)應(yīng)該在websocket的on_close方法關(guān)閉(推薦)
如果用在其它地方, 請(qǐng)仔細(xì)調(diào)試過(guò)后再試用. 作者不保證在websocket以外的地方能正常(正確)工作.
此方法沒(méi)有返回值.
有小伙伴對(duì)websocket長(zhǎng)連接有興趣的可以下載cf發(fā)布在docker hub上的容器體驗(yàn)一下, 使用chrome的websocket客戶(hù)端插件(smart websocket client)就可以對(duì)接查看效果.
MQ庫(kù)是因?yàn)闉閷?duì)接第三方協(xié)議(gRPC等)平臺(tái)而自己創(chuàng)建的一種消息通訊方式. 很多使用者因?yàn)樽孕卸ㄖ苹瘏f(xié)議, 所以CF作者用MQ示例來(lái)作為一種最直觀的對(duì)接方式.
更多建議: