Nginx通過LUA腳本訪問RabbitMQ消息隊列

MaiKashiwag 8年前發布 | 16K 次閱讀 消息系統

來自: http://blog.csdn.net//jiao_fuyou/article/details/38753005


發現了一個Nginx的LUA腳本:lua-resty-rabbitmqstomp,可以讓Nginx通過LUA腳本訪問RabbitMQ消息隊列,這個腳本是通過stomp協議連接RabbitMQ的stomp適配器,來pub/sub消息的

關于RabbitMQ-STOMP安裝使用相關內容可以參見:RabbitMQ STOMP Adapter

關于Nginx-LUA模塊安裝使用參見:LAMP架構演進到LAMPGC,再演進到LNMLGC

關于STOMP協議相關資料參見這里:

STOMP官方英文協議1.1版

STOMP協議學習與實戰-1.1版

STOMP官方英文協議1.2版

STOMP協議說明書-1.2版


nginx配置:

location /rabbitmq {
            lua_code_cache off;
            content_by_lua_file conf/rabbitmq.lua;
        }

rabbitmq.lua源碼如下,該腳本簡單的實現pub一個消息然后再sub該消息,set_timeout(60000)表示sub消息如果沒有消息時等待60S超時

local strlen =  string.len
local json = require "json"
local rabbitmq = require "rabbitmqstomp"

local mq, err = rabbitmq:new()
if not mq then
      return
end

mq:set_timeout(60000)

local ok, err = mq:connect {
                    host = "127.0.0.1",
                    port = 61613,
                    username = "guest",
                    password = "guest",
                    vhost = "/"
                }
if not ok then
    return
end
ngx.log(ngx.INFO, "Connect: " .. "OK")

local msg = {key="value1", key2="value2"}
local headers = {}
headers["destination"] = "/queue/my_queue"
headers["receipt"] = "msg#1"
headers["app-id"] = "luaresty"
headers["persistent"] = "true"
headers["content-type"] = "application/json"

local ok, err = mq:send(json.encode(msg), headers)
if not ok then
    return
end
ngx.log(ngx.INFO, "Published: " .. json.encode(msg))

local headers = {}
headers["destination"] = "/queue/my_queue"
headers["persistent"] = "true"
headers["id"] = "123"

local ok, err = mq:subscribe(headers)
if not ok then
    return
end

local data, err = mq:receive()
if not data then
    return
end
ngx.log(ngx.INFO, "Consumed: " .. data)
ngx.header.content_type = "text/plain";
ngx.say(data);

local headers = {}
headers["persistent"] = "true"
headers["id"] = "123"

local ok, err = mq:unsubscribe(headers)

local ok, err = mq:set_keepalive(10000, 10000)
if not ok then
    return
end

具體擴展一下,可以實現推送功能:發送方調用send將消息pub到RabbitMQ,接收方設置一個超時調用subscribe訂閱消息(就類似于long polling)


 本文由用戶 MaiKashiwag 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!