nestjs中配置rabbitmq微服务需建立可靠连接并明确消息流向:服务端用createmicroservice()配置urls、queue、noack=false及durable=true;客户端通过clientsmodule或clientproxyfactory创建代理,使用emit或send发送消息;消费者用@payload()和@ctx()处理数据与手动确认。

在 NestJS 中配置和使用 RabbitMQ 微服务传输器,核心是两件事:建立可靠连接 + 明确消息流向(谁发、谁收、用哪个队列)。不需要重写底层通信逻辑,Nest 提供了开箱即用的封装。
RabbitMQ 服务端配置(创建微服务)
用 createMicroservice() 启动一个监听 RabbitMQ 的微服务实例。关键配置项必须明确:
-
urls:AMQP 连接地址,格式如
'amqp://admin:admin@localhost:5672',含用户名密码更安全 -
queue:该服务要监听的队列名,比如
'notifications_queue' -
noAck:设为
false启用手动确认,避免消息丢失;设为true则自动确认(不推荐生产环境) -
queueOptions.durable:设为
true可让队列在 RabbitMQ 重启后依然存在
RabbitMQ 客户端配置(调用微服务)
客户端负责发送消息,可用 ClientsModule.register() 或 ClientProxyFactory 创建代理实例:
- 同样需要
urls和queue,确保与服务端一致 - 推荐用
name字段定义注入 Token(如'NOTIFICATION_CLIENT'),便于 DI 管理 - 发送时用
.emit(queueName, payload)发布事件,或用.send(pattern, payload)触发请求响应模式
消息处理与上下文访问
消费者方法通过装饰器接收数据和上下文:
-
@Payload()获取原始消息体,支持类型推导(如@Payload() data: { id: number }) -
@Ctx() context: RmqContext可读取底层信道信息,例如context.getChannelRef()或context.getMessage() - 手动确认需调用
context.getChannelRef().ack(message)(配合noAck: false)
开发环境快速启动 RabbitMQ
本地调试建议用 Docker 一键拉起带管理界面的实例:
- 运行命令:
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:management - 浏览器打开 https://www.php.cn/link/9e7a3b6fbfa4f7c2052f776f1b4eab35,用 admin/admin 登录查看队列状态
- 注意:生产环境务必修改默认凭据,并启用 TLS 加密











