You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NestJS NATS微服务仅监听首个Broker节点问题求助

NestJS NATS微服务仅接收首个Broker节点消息的问题及解决

问题描述

我在研究微服务时,遇到NestJS中一处未被文档记载的异常行为。搭建了以NATS为消息中间件的基础微服务,启动配置如下:

// bootstrap method
const app = await NestFactory.createMicroservice<MicroserviceOptions>(
    TestModule,
    {
      transport: Transport.NATS,
      options: {
        servers: ['nats://remote-nats-1:4222', 'nats://remote-nats-2:4222'],
      },
    },
);
await app.listen()

配套的模块与控制器代码:

// module
@Module({
  controllers: [TestController],
})
export class TestModule {}
// controller
@Controller()
export class TestController {
  @MessagePattern('message1')
  async message1() {}

  @MessagePattern('message2')
  async message2() {}
}

实际运行中,message1来自其中一个Broker节点,message2来自另一个,但控制器仅能监听到servers数组首个地址节点的消息。已查阅官方文档,尝试在控制器内初始化客户端、给@MessagePattern配置额外参数,均未解决问题。

解决方法

1. 为消息模式配置队列组(Queue Groups)

NATS集群中,默认点对点订阅仅会接收当前连接节点的消息,通过队列组可以让集群将消息分发到任意订阅了该队列的服务实例。修改控制器的消息模式定义:

@Controller()
export class TestController {
  @MessagePattern({ cmd: 'message1', queue: 'test-service-queue' })
  async message1() {}

  @MessagePattern({ cmd: 'message2', queue: 'test-service-queue' })
  async message2() {}
}

2. 调整NATS客户端全局订阅配置

在微服务启动配置中添加全局订阅选项,确保客户端以集群模式处理消息:

const app = await NestFactory.createMicroservice<MicroserviceOptions>(
    TestModule,
    {
      transport: Transport.NATS,
      options: {
        servers: ['nats://remote-nats-1:4222', 'nats://remote-nats-2:4222'],
        subscribeOptions: {
          queue: 'test-service-queue', // 全局统一队列组
        },
        maxReconnectAttempts: -1, // 开启无限重连保证集群连接稳定性
        reconnectTimeWait: 2000,
      },
    },
);
await app.listen();

3. 验证NATS集群节点连通性

确保两个NATS节点已正确组成集群(通过cluster配置或routes参数建立节点间连接)。若节点未形成集群,消息无法跨节点转发,自然只能收到首个节点的消息。可使用nats-top或NATS CLI工具查看集群状态,确认节点已互相注册。

原理说明

队列组是NATS实现集群消息分发与负载均衡的核心机制:当多个订阅者使用同一队列组时,NATS集群会将来自任意节点的消息均匀分发给队列组内的订阅实例,而非仅发送给当前连接的节点。

内容的提问来源于stack exchange,提问作者ShonS1v4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 17:50:30