- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在以下场景中使用 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/
我是一名优秀的程序员,十分优秀!