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