我正试图围绕 Redis Pub/Sub API 并设置一个长轮询服务器。
这个 lua 脚本订阅了一个“测试”频道并返回收到的新消息:
nginx.conf:
location /poll {
lua_need_request_body on;
default_type 'text/plain';
content_by_lua_file '/usr/local/nginx/html/poll.lua';
}
投票.lua:
local redis = require "redis";
local red = redis:new();
local cjson = require "cjson";
red:set_timeout(30000) -- 30 sec
local resCon, err = red:connect("127.0.0.1", 6379)
if not resCon then
ngx.print("error")
return
end
local resSub, err = red:subscribe('r:' .. ngx.var["arg_r"]:gsub('%W',''))
if not resSub then
ngx.print("error")
return
end
if resSub == ngx.null then
ngx.print("error")
return
end
local resMsg, err = red:read_reply()
if not resMsg then
ngx.say("0")
return
end
ngx.say(cjson.encode(resMsg))
客户端.js:
var tmpR = 'test';
function poll() {
$.get('/poll', {'r':tmpR}, function(data){
if (data !== "error") {
console.log(data);
window.setTimeout(function(){
poll();
},1000);
} else {
console.log('poll fail');
}
})
}
现在,如果我publish r:test hello
从 redis-cli 发送,我会在客户端收到消息,服务器会使用1
. 但是,如果我快速发送两条消息,第二条消息不会广播,服务器会以0
.
我的频道是否只能每秒接收一条消息,或者,这是否限制了用户可以向频道广播的消息频率?
假设许多用户可能一次连接,这是在 nginx 上接近这个轮询服务器的正确方法吗?在计时器上使用 GET 请求会更有效吗?