gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 07:17:39 24 4
gpt4 key购买 nike

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

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

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

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

这是我当前解决方案和预期行为的小动画: enter image description here

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

最佳答案

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

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

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

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

  • 设置您的队列路由,以便来自同一用户的消息始终发送到同一消费者。不利之处在于,如果您不平均分配流量,您可能会在其他消费者闲置时让一些消费者得到支持。

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

关于RabbitMQ - 每个用户只允许一个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58701962/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com