希望使用 openresty 中的 lua-resty-websocket 与 nanomsg 实现一个 pubsub 模型,但是发现,websocket 的 连接 会被 nanomsg 连接的 recv_zc() 阻塞,
表现是,websocket 客户端请求,这时没有响应,在 nanomsg 的 pub 端发送消息,然后 websocket 客户端会同时收到 nanomsg 的sub 消息和刚才 websocket 客户端的响应。
local server = require 'resty.websocket.server'
local nn = require 'nanomsg-ffi'
local nano, err = nn.socket(nn.SUB)
if not nano then
ngx.say("error: ", nn.strerror(err))
return
end
if not nanoid then
ngx.say("error: ", nn.strerror(err))
return
end
local rc, err = nano:setsockopt(nn.SUB, nn.SUB_SUBSCRIBE, "broadcast" )
if rc < 0 then
ngx.say("error: ", nn.strerror(err))
return
end
local wb, err = server:new{
timeout = 5000,
max_payload_len = 65535
}
if not wb then
ngx.log(ngx.ERR, "failed to new websocket: ", err)
return ngx.exit(444)
end
local t_nanomsg = ngx.thread.spawn(function ()
while true do
local msg, err = nano:recv_zc()
if not msg then
ngx.say("error: ", nn.strerror(err))
break
end
local bytes, err = wb:send_text("from nanomsg: " .. msg:tostring())
if err then
ngx.say("failed to send reply: ", err)
break
end
end
end)
while true do
local data, typ, err = wb:recv_frame()
if wb.fatal then
ngx.log(ngx.ERR, "failed to receive frame: ", err)
return ngx.exit(444)
end
if typ == "close" then break
elseif typ == "text" then
local bytes, err = wb:send_text("from websocket server: " .. data)
if not bytes then
ngx.log(ngx.ERR, "failed to send text: ", err)
return ngx.exit(444)
end
end
end
wb:send_close()