繁体   English   中英

RabbitMQ - 每个用户只允许一个进程

[英]RabbitMQ - allow only one process per user

为了简短起见,这里有一个简化的情况:

我需要为导入的数据文件的后台处理实现一个队列。 我想为这个特定任务指定一些消费者(比如说 10 个),以便可以并行处理多个用户。 同时,为了避免并发数据写入的问题,我需要确保没有一个用户同时在多个消费者中处理,基本上单个用户的所有文件都应该顺序处理。

当前解决方案(但感觉不对):

  • 有 1 个发布所有导入任务的队列( file_queue_main
  • 有 10 个用于文件处理的队列( file_processing_n
  • 有 1 个结果队列 ( file_results_queue )
  • 有一个管理器进程(在本例中为node.js ),它一个一个地使用来自 file_queue_main 的消息,并决定将该消息分发到哪个file_processing队列。 基本上跟踪当前用户正在处理的文件处理file_processing中。

这是我当前解决方案和预期行为的一点 animation: 在此处输入图像描述

RabbitMQ 甚至是这项工作的工具吗? 出于某种原因,它感觉像是某种反模式。 感谢任何帮助!

对我来说“感觉不对”的部分是经理流程。 它必须知道每个消费者当前的 state,如果所有处理器都在为其他用户工作,它还必须停下来等待。 理想情况下,您更愿意让每个进程不了解其他进程。 您从处理队列中获得的好处也很少,只有在处理器已经在处理来自同一用户的消息时才会使用这些队列。

最终,这里的最佳解决方案将取决于您的预期使用情况以及下一条消息来自已被处理的用户的可能性有多大。 如果您希望在任何时候收到的大多数消息都来自 10 个或更少的用户,那么您所拥有的可能没问题。 如果您希望处理来自许多不同用户的消息,并且偶尔会出现重复,那么您的处理队列大部分时间都是空的,并且您已经创建了很多不必要的复杂性。

你可以在这里做的其他事情:

  • 让所有消费者从同一个队列中拉出并使用某种分布式锁定来防止冲突。 如果消费者从已经在处理的用户那里收到消息,请将其重新排队并继续。

  • 设置您的队列路由,以便来自同一用户的消息将始终 go 发送到同一消费者。 不利的一面是,如果您没有将流量平均分配出去,您可能会让一些消费者备份,而另一些消费者则闲置。

此外,如果您一次从同一用户那里收到大量必须按顺序处理的消息,我会质疑它们是否应该是单独的消息。 为什么不发送一条包含要处理的事物列表的消息? 事件队列的大部分好处来自于能够将每个事件视为可以单独处理的离散项。

如果用户有一个唯一的 ID,或者正在处理的文件有一个唯一的 ID,那么 hash 的 ID 可以让处理队列进入。 这样,您将始终有相同的用户/文件任务在同一个处理队列中排队。

我不确定这将如何影响处理队列的队列长度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM