对于使用 Queues 和 Exchanges 的RabbitMQ最佳实践,我有些困惑。假设我想传递一条GenerateInvoice
消息以及一些发票数据,并让多个使用者处理发票数据并生成PDF。每个GenerateInvoice
只能由一个使用者处理。
一种方法是声明一个队列并将GenerateInvoice
消息发布到此队列,并让所有使用者从该队列中使用。这样可以在不同的使用者之间分发消息。
我尚不清楚,是否上述方法还可以,或者最佳实践是将邮件传递到 Exchange 而不是直接将其发布到队列中。使用 Exchange ,我必须确保在生产者创建Exchange之后,在开始发布消息之前就声明了队列。否则,没有队列将接收到消息,并且消息将丢失。
答案 0 :(得分:1)
在这种情况下,可以声明一个队列,将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 -> { });