我正在使用RabbitMQ来实现以下场景。当用户使用高级搜索功能时,我通过RabbitMQ向一些服务器实例之一发送消息。它们运行相同的例程(数据库查询和计费)。我想确保不会多次处理同一条消息。
我遇到this great tutorial,但其中提供的交换类型是“主题”,这对我不起作用,因为我不止一次处理同一条消息。
如何在RabbitMQ中使用工作队列实现请求 - 响应模式,以便每个消息只处理一次并进行负载平衡?
答案 0 :(得分:1)
Anton Gogolev上面的评论是正确的。由于多种原因,您无法保证邮件只会被处理一次。但是,这通常是系统的要求 - 只产生一次所需的结果。
这样做的方法是通过idempotence - 无论处理给定消息多少次,它都只会进行一次所需的更改。
有很多方法可以做到这一点。一个简单的示例是使用共享数据库来跟踪已处理的消息。收到消息时,检查是否已经处理过消息。如果没有,你处理它。如果有,你只需忽略它并继续前进。
在您的情况下,如果您正在执行请求/响应并希望进行负载平衡,则可能需要同一队列中的多个使用者。您可以让2或10或300个请求处理程序实例侦听同一个队列,并且您不必担心重复处理。
RabbitMQ会将给定的消息发送给单个消费者。它将等待该消费者说它已完成处理,或者如果消费者崩溃或拒绝该消息,它将重新排队该消息以供另一个消费者重试。
通过这种方式,每个请求通常只有一个请求处理程序。但是不止一个人总是可以处理相同的信息,这就是幂等性很重要的原因。
关于使用主题交换与任何其他类型的交换 - 它没有太大区别。始终可能有多个队列接收您要发送的消息,因为您可以使用相同的绑定密钥将多个队列绑定到同一个交换机。