0

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

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

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

第一个很容易解决:您只需确保具有相同标志的消息始终由同一个工作人员处理,并将其预取设置为 1。为了确保您可以使用x-consistent-hash交换器。

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

现在,虽然这基本上可行,但它引入了一些问题,我不太确定如何解决它们:

  • 如果我将prefetch选项设置为 1,事情会变得更慢,因为我无法并行处理消息。这大大降低了性能。
  • 如果我为每个标志使用单独的队列,我最终会得到大量队列(> 10k)。虽然这似乎不是 RabbitMQ 处理的问题,但我想知道这是否是个好主意。
  • 此外,我现在有多个工作“步骤”,即一旦一个消息已由工作人员处理,它会将其放入另一个 RabbitMQ,并且同样的事情重新开始。这意味着,如果我不为每个步骤使用单独的 RabbitMQ 实例,我最终会得到很多队列(n 个交换n 次 10k队列)。

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

4

1 回答 1

0

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

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

于 2014-12-17T17:03:04.553 回答