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