使用 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