【发布时间】:2020-03-01 06:33:34
【问题描述】:
为了简短起见,这里有一个简化的情况:
我需要为导入的数据文件的后台处理实现一个队列。我想为这个特定任务指定一些消费者(比如说 10 个),以便可以并行处理多个用户。同时,为了避免并发数据写入的问题,我需要确保没有一个用户同时在多个消费者中处理,基本上单个用户的所有文件都应该顺序处理。
目前的解决方案(但感觉不对):
- 有 1 个队列用于发布所有导入任务 (
file_queue_main) - 有 10 个队列用于文件处理 (
file_processing_n) - 有 1 个结果队列 (
file_results_queue) - 有一个管理器进程(在本例中为
node.js),它会一个一个地使用来自file_queue_main 的消息,并决定将该消息分发到哪个file_processing队列。基本上跟踪当前用户正在处理的file_processing队列。
RabbitMQ 甚至是这项工作的工具吗?出于某种原因,它感觉像是某种反模式。感谢任何帮助!
【问题讨论】:
-
由于您希望为每个用户序列化文件,因此您需要有用户特定的队列。然后可以根据负载和流量条件生成消费者。
-
感谢您的评论。据我了解,这也意味着每个用户都会有一个消费者?如何将消费者数量限制为 10,同时确保一些随机的 10 个用户不会填满队列,使其他用户永远等待?在我的解决方案中,消息按照它们进入的顺序进行处理,但是如果每个用户都有一个队列,那么当用户开始处理时,只要消费者已经启动,他就可以无限地添加文件。
-
我认为 Kafka 可能是一个更清洁的解决方案。您可以绕过竞争工人模式的所有协调和复杂性。使用 Kafka 来实现并行性并提高吞吐量,您只需向 Kafka 主题添加更多代理,就是这样!
-
也许我遗漏了一些东西,但是如果您创建十个队列(和十个消费者),然后在您将用户发布到交易所时分配具有等于
user_id mod 10的路由密钥的用户。然后你可以确定同一个用户总是进入同一个队列。即用户120去queue_0,121去queue_1...用户123451去queue_1等等? -
目标是有效利用所有 10 个消费者。如果我通过简单的
mod 10分发消息,那么很有可能一些消费者会空闲。