RabbitMQ - 发布到队列或交换

RabbitMQ - publish to Queue or Exchange

关于使用 QueuesExchanges 的 RabbitMQ 最佳实践,我有点困惑。假设我想发送一条 GenerateInvoice 消息,其中包含一些发票数据,并让多个消费者处理发票数据并生成 PDF。每个 GenerateInvoice 只能由一个消费者处理。

一种方法是声明一个队列并将GenerateInvoice消息发布到这个队列,让所有消费者从这个队列中消费。这将在不同的消费者之间分发消息。

我不清楚,如果上述方法没问题,或者最佳做法是将消息传送到 Exchange 而不是直接将它们发布到队列。使用 Exchange 我必须确保在生产者创建 Exchange 之后再开始发布消息之前声明一个队列。否则没有队列会收到消息并且消息会丢失。

在这种情况下,声明队列、将 GenerateInvoice 消息发布到队列并为队列设置多个消费者都可行。

发布到队列的消息不会丢失,如果没有消费者,它们会留在 RMQ 上。唯一的事情是确保在发布消息之前声明队列。

Java 示例:

channel.queueDeclare(QUEUE_NAME, false, false, false, null);

然后,可以按以下方式进行发布:

channel.basicPublish("", QUEUE_NAME, null, message.getBytes());

消费可以这样来完成:

channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });