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