使用 Nestjs 监听多个 RabbitMQ 队列

Posted

技术标签:

【中文标题】使用 Nestjs 监听多个 RabbitMQ 队列【英文标题】:Listening to multiple RabbitMQ queues with Nestjs 【发布时间】:2020-11-07 00:09:05 【问题描述】:

我正在查看 Nestjs 文档来设置一个监听 RabbitMQ 消息的微服务。当我必须听一个队列时,这非常简单。如果我的微服务必须监听多个队列怎么办?我使用的是在 main.ts 文件中完成的以下方法。

await app.connectMicroservice(
    transport: Transport.RMQ,
    options: 
      urls: ['amqp://localhost:5672'],
      queue: 'q-1',
      queueOptions: 
        durable: false
      ,
    ,
  );

现在我有多个队列,我可以调用另一个 connectMicroservice 函数来执行此操作。但是,当在我的控制器中使用消息时,无法告诉我的控制器要监听哪个队列(q-1 或 q-2)。我只知道有一个 @MessagePattern 装饰器可以提及在该函数中使用什么模式,但不确定如何提及队列名称。

【问题讨论】:

【参考方案1】:

RabbitMQ 内置的 NestJS 微服务实现在涉及这些类型的场景时有点受限。

@golevelup/nestjs-rabbitmqpackage 专为解决这些功能差距而构建。它为您提供了更好的集成,使您可以直观地与单个 NestJS 应用程序或微服务内的多个 RabbitMQ 交换和队列进行交互。它还旨在为不同的消息传递模式(如发布/订阅和 RPC)提供更好的支持。

免责声明:我是这个包的作者

【讨论】:

【参考方案2】:

只需添加如下代码:

await app.connectMicroservice(
    transport: Transport.RMQ,
    options: 
      urls: ['amqp://localhost:5672'],
      queue: 'q-1',
      queueOptions: 
        durable: false
      ,
    ,
  );
await app.connectMicroservice(
    transport: Transport.RMQ,
    options: 
      urls: ['amqp://localhost:5672'],
      queue: 'q-2',
      queueOptions: 
        durable: false
      ,
    ,
  );

或者更简单的解决方案:

for (const queue of ['q-1', 'q-2']) 
  await app.connectMicroservice(
    transport: Transport.RMQ,
    options: 
      urls: ['amqp://localhost:5672'],
      queue,
      queueOptions: 
        durable: false
      ,
    ,
  );

app.startAllMicroservices();

【讨论】:

以上是关于使用 Nestjs 监听多个 RabbitMQ 队列的主要内容,如果未能解决你的问题,请参考以下文章

NestJS - 在微服务中结合 HTTP 和 RabbitMQ

NestJS:有没有办法从外部调用微服务rabbitmq

rabbitmq 配置多个消费者(转载)

RabbitMQ怎样能实现多个队列由一个消费者来接收消息

使用 RabbitMQ 有没有办法在没有出队操作的情况下查看队列内容?

RabbitMQ 死信队列 定时队列 延时队列