【问题标题】:Request-response pattern with worker queues in RabbitMQRabbitMQ 中带有工作队列的请求-响应模式
【发布时间】:2015-11-02 15:53:48
【问题描述】:

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

【问题讨论】:

  • 您无法使用 RabbitMQ(或其他任何分发的东西)获得“Exactly-Once Delivery”。这只是[不可能][1]。 [1]:en.wikipedia.org/wiki/Two_Generals%27_Problem
  • 这里的实际问题是什么?您已经概述了一系列潜在问题,但没有提出任何问题。请编辑帖子以提出具体问题。

标签: c# rabbitmq


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 那么是否可以将 RPC 与许多像工作模式一样工作的“服务器”一起使用? rabbitmq.com/tutorials/tutorial-six-python.html
  • 在上面的链接中,他们写道“如果 RPC 服务器太慢,您可以通过运行另一个服务器来扩展。尝试在新控制台中运行第二个 rpc_server.py。”那么 RPC 是不是一种只带响应的 Woker 模式?
猜你喜欢
  • 2018-01-23
  • 1970-01-01
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 2017-11-23
  • 1970-01-01
相关资源
最近更新 更多