gpt4 book ai didi

c# - RabbitMQ 中工作队列的请求-响应模式

转载 作者:行者123 更新时间:2023-11-30 17:41:05 24 4
gpt4 key购买 nike

我在以下场景中使用 RabbitMQ。当用户使用高级搜索功能时,我通过 RabbitMQ 向几个服务器实例之一发送一条消息。他们运行相同的程序(数据库查询和计费)。我想确保我不会多次处理同一条消息。我遇到过this great tutorial但是其中显示的交换类型是“主题”,这对我不起作用,因为我不止一次处理同一条消息。
如何在 RabbitMQ 中使用工作队列实现请求-响应模式,以便每条消息只处理一次并实现负载平衡?

最佳答案

Anton Gogolev 的上述评论是正确的。出于多种原因,您不能保证一条消息只会被处理一次。但是,这通常是系统的要求——只产生一次所需的结果。

做到这一点的方法是通过 idempotence - 无论给定消息被处理多少次,它只会进行一次所需的更改。

有很多方法可以做到这一点。一个简单的示例是使用一个共享数据库来跟踪哪些消息已被处理。当您收到一条消息时,您会检查它是否已被处理。如果没有,你处理它。如果有,您只需忽略它并继续前进。

在您的情况下,如果您正在执行请求/响应并希望负载平衡,您可能希望同一队列中有多个消费者。您可以让请求处理程序的 2 个、10 个或 300 个实例监听同一个队列,并且您不必太担心重复处理。

RabbitMQ 会将给定的消息发送给单个消费者。它将等待该消费者说它已完成处理,或者如果消费者崩溃或拒绝消息,它将重新排队消息以供另一个消费者重试。

这样,您通常每个请求只有 1 个请求处理程序。但是总是有可能不止一个人处理同一条消息,这就是幂等性很重要的原因。

关于主题交换与任何其他类型的交换的使用 - 没有太大区别。总会有多个队列接收您发送的消息的可能性,因为您可以使用相同的绑定(bind)键将多个队列绑定(bind)到同一个交换器。

关于c# - RabbitMQ 中工作队列的请求-响应模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33481640/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com