分享

Nginx通过LUA脚本访问RabbitMQ消息队列

 waitingnothing 2017-08-04

发现了一个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)


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多