RabbitMQ - 发布到队列或交换
RabbitMQ - publish to Queue or Exchange
关于使用 Queues 和 Exchanges 的 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 -> { });
关于使用 Queues 和 Exchanges 的 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 -> { });