可以暂停的订单保留队列

时间:2014-12-17 08:10:28

标签: architecture routing rabbitmq message-queue dht

我目前正在开发一种使用RabbitMQ向工作人员传递消息的软件。基本上,这是一项非常简单的任务,因为您可以使用单个队列进行单个直接交换,并且所有工作人员都使用该队列。完成工作。

但现在,情况开始变得复杂。如果有两个额外的要求,那就让我想到:

  • 消息并非全部相等,即消息具有"标志",用于对消息进行分组。现在第一个要求是所有具有相同"标志的消息"按顺序处理。
  • 希望"暂停"处理具有特定标志的所有消息。

第一个很容易解决:您只需要确保具有相同标志的消息始终由同一个worker处理,并将其预取设置为1.为了确保您可以使用{{1交换。

第二个也很容易解决:您只需为每个标志使用单独的队列,然后就可以停止处理队列了。

现在,虽然这基本上有效,但它引入了一些问题,而且我不太清楚如何解决它们:

  • 如果我将x-consistent-hash选项设置为1,则事情会变慢,因为我无法并行处理消息。这大大降低了性能。
  • 如果我为每个标志使用单独的队列,我最终会得到大量队列(> 10k)。虽然这对RabbitMQ来说似乎不是一个问题,但我想知道这是不是一个好主意。
  • 此外,我现在有多个工作人员"步骤",即一旦工作人员处理了一条消息,它就把它放到另一个RabbitMQ上,同样的事情重新开始。这意味着,如果我不为每一步使用RabbitMQ的单独实例,我最终会得到批次的队列( n exchange n次10k >队列)。

有没有更好的方法来解决这个问题?如果是这样,怎么样?任何想法,提示,......?

1 个答案:

答案 0 :(得分:0)

处理具有相同“标志”的所有消息,以便我建议设置具有多个队列的交换,并且交换机根据路由密钥将消息路由到不同的队列(这是路由键设计用于)。这样,您就不需要将预取设置为1,您有一个专用于该路由密钥的队列。

如果您有10k +“标志”,那么您会遇到不同的问题。拥有那么多队列是可能的,但不是很容易维护。你可能有一个“高优先级队列”,其中重要的标志被路由到少数队列,所有其余的“非重要标志”被路由到一个“低优先级队列”?