【发布时间】:2015-02-15 17:26:42
【问题描述】:
我目前正在开发一个使用 RabbitMQ 向工作人员传递消息的软件。基本上,这是一项非常容易的任务,因为您可以使用单个队列的单个直接交换,并且所有工作人员都使用该队列。任务完成。
但现在,事情开始变得复杂起来。如果有两个额外的要求,那让我想到:
- 消息并不完全相同,即消息有一个“标志”,用于对消息进行分组。现在第一个要求是所有具有相同“标志”的消息都按顺序处理。
- 希望“暂停”处理具有特定标志的所有消息。
第一个很容易解决:您只需确保具有相同标志的消息始终由同一个工作人员处理,并将其预取设置为 1。为确保您可以使用 x-consistent-hash交换。
第二个也很容易解决:您必须为每个标志使用单独的队列,然后您可以停止处理队列。
现在,虽然这基本上可行,但它引入了一些问题,我不太确定如何解决它们:
- 如果我将
prefetch选项设置为1,事情会变得更慢,因为我无法并行处理消息。这会大大降低性能。 - 如果我为每个标志使用单独的队列,我最终会得到大量队列 (> 10k)。虽然这似乎不是 RabbitMQ 可以处理的问题,但我想知道这是否是个好主意。
- 此外,我现在有多个工作“步骤”,即,一旦工作人员处理了一条消息,它就会将它放到另一个 RabbitMQ 中,然后同样的事情重新开始。这意味着,如果我不为每个步骤使用单独的 RabbitMQ 实例,我最终会得到 lots 个队列(n 个交换 和 n 次 10k 队列)。
有没有更好的方法来解决这个问题?如果是这样,怎么做?有什么想法、提示……?
【问题讨论】:
标签: architecture routing rabbitmq message-queue dht