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

本文介绍了如何使用Nginx的LUA脚本结合stomp协议,通过RabbitMQ的stomp适配器进行消息队列的pub/sub操作。详细演示了lua-resty-rabbitmqstomp脚本的使用方法,包括配置、连接、发布和订阅消息的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


<think>好的,用户想了解Nacos、Redis、NginxRabbitMQ的详细功能对比及应用场景。首先需要分别整理每个组件的核心功能和特点,然后进行比较,最后说明它们的应用场景。要注意用户之前提到的Docker部署相关的内容,可能需要结合容器化环境来谈应用。 首先,Nacos是服务发现和配置管理,属于微服务架构的基础组件。Redis是内存数据库,用于缓存和高速数据访问Nginx作为反向代理和负载均衡,处理HTTP请求的分发。RabbitMQ消息队列,用于应用间的异步通信和解耦。这四个组件在系统架构中各自扮演不同角色,通常不会直接竞争,而是协同工作。 接下来需要详细每个组件的功能,比如Nacos的服务注册与发现、配置管理、健康检查等。Redis的数据结构支持、持久化、高可用。Nginx的负载均衡、静态资源服务、SSL终端。RabbitMQ的消息路由、可靠性传输、插件扩展。 然后对比它们的应用场景,例如微服务中Nacos用于服务治理,Redis用于缓存会话或数据,Nginx处理前端请求和负载均衡,RabbitMQ用于订单队列或日志处理。需要举例说明,比如电商系统中这四个组件如何协作。 用户可能还想知道在容器化部署中的使用情况,比如Docker中如何配置这些组件,可以参考之前的引用中提到的Docker命令和部署流程。确保回答结构清晰,分点说明,并生成相关问题,帮助用户进一步学习。</think>### Nacos/Redis/Nginx/RabbitMQ功能对比及应用场景 #### 一、核心功能对比 | 组件 | 类型 | 核心功能 | 数据特性 | |-----------|----------------|--------------------------------------------------------------------------|------------------------------| | **Nacos** | 服务发现与配置 | 服务注册/发现、动态配置管理、健康检查 | 元数据存储、配置版本控制 | | **Redis** | 内存数据库 | 键值存储、缓存加速、分布式锁、消息队列 | 高性能、持久化、数据结构丰富 | | **Nginx** | Web服务器 | 反向代理、负载均衡、HTTP缓存、SSL终端、静态资源服务 | 高并发处理、低内存消耗 | | **RabbitMQ** | 消息中间件 | 消息路由、队列管理、事务消息、死信队列 | 可靠性、多协议支持 | #### 二、技术特性详解 1. **Nacos** - **服务拓扑管理**:自动生成微服务依赖关系图(需配合监控插件) - **配置灰度发布**:支持按IP/标签分组推送配置更新 - **临时/持久节点**:区分短心跳服务与物理设备注册 - **多环境支持**:通过`namespace`实现开发/测试/生产环境隔离[^1] 2. **Redis** - **数据结构扩展**:GEO地理坐标、HyperLogLog基数统计 - **集群方案**:Codis/Redis Cluster不同分片策略 - **持久化机制**:RDB快照与AOF日志混合模式 - **缓存穿透解决方案**:BloomFilter布隆过滤器 3. **Nginx** - **负载均衡算法**:轮询/加权/ip_hash/least_conn - **动态模块加载**:无需重新编译核心模块 - **Lua脚本扩展**:OpenResty实现API网关功能 - **HTTP/2支持**:优化现代Web应用传输效率[^2] 4. **RabbitMQ** - **交换机类型**:direct/topic/headers/fanout - **消息确认机制**:生产者confirm与消费者ack - **优先级队列**:支持消息紧急程度分级 - **插件体系**:Sharding分区插件、延迟队列插件 #### 三、典型应用场景 **电商系统架构示例**: ```mermaid graph LR A[客户端] --> B[Nginx负载均衡] B --> C[订单服务] B --> D[商品服务] C --> E[RabbitMQ订单队列] D --> F[Redis库存缓存] E --> G[支付系统] F --> H[数据库] C & D --> I[Nacos服务注册] ``` 1. **Nacos**: - 场景:微服务架构中的服务自动注册与发现 - 案例:动态调整支付服务实例权重实现金丝雀发布 2. **Redis**: - 场景:秒杀系统库存预扣减 ```python # 使用Redis+Lua实现原子操作 script = """ local stock = redis.call('get', KEYS[1]) if tonumber(stock) > 0 then redis.call('decr', KEYS[1]) return 1 end return 0 """ secKill = redis.register_script(script) ``` 3. **Nginx**: - 场景:AB测试流量切分配置 ```nginx split_clients "${remote_addr}AAA" $variant { 50% "A"; 50% "B"; } location / { proxy_pass http://backend_$variant; } ``` 4. **RabbitMQ**: - 场景:订单超时自动取消 ```java // 设置消息延迟投递 AMQP.BasicProperties props = new AMQP.BasicProperties.Builder() .expiration("300000") // 5分钟 .build(); channel.basicPublish("delayed-exchange", "order", props, message); ``` #### 四、容器化部署要点 1. **Nacos集群**:需配置`cluster.conf`指定节点IP 2. **Redis哨兵**:建议使用官方`redis-sentinel`镜像 3. **Nginx配置热更新**:`docker exec nginx nginx -s reload` 4. **RabbitMQ镜像选择**:带管理插件的`rabbitmq:3-management`版本[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值