Python 芹菜动态排队

问题描述 投票:0回答:1

Celery 是否适合我们的用例,我有点困惑。

我们有成千上万的网络设备可以用来获取/发送信息。这些操作可能非常耗时,因此芹菜。

我们有 X 名芹菜工人。

但是这些设备不接受并发连接(有时一次不超过一个连接)。当多个任务排队等待同一个设备时,它们最终会落在不同的工人身上,我们就会失败。

装备是根据任务的参数推导出来的。

两个想法:

  • 动态创建队列,每个设备一个。每个队列都在一个 worker 上运行。我们最终会得到成千上万的小队列,一旦所有任务完成,它们就需要自动删除。
  • 或单个队列,但如果工人当前正在处理设备,任务将“暂停”。

热烈欢迎任何意见:)

PS:我们用的是django,考虑redis或者rabbitmq

python redis rabbitmq celery
1个回答
0
投票

您提出的两种解决方案都可以根据您的用例的具体情况工作。以下是每个方面的一些注意事项:

动态创建队列,每个设备一个: 该解决方案将确保特定设备的任务始终由同一个工作人员处理,这将防止与设备的并发连接。但是,正如您提到的,这可能会导致大量队列,这可能难以管理。此外,您需要一种方法来根据需要动态创建和删除队列,这可能会增加系统的复杂性。

单队列,但如果工人当前正在处理设备,任务将“暂停”: 该解决方案将使用单个队列,但需要一些额外的逻辑来确保特定设备的任务不会同时执行。实现这一点的一种方法是使用锁来防止多个工人同时处理同一设备的任务。这将确保每台设备一次只能由一名工人访问,但如果一名工人已经在处理同一设备的任务,则可能会导致某些任务延迟。

总的来说,两种解决方案都各有利弊,最佳方法将取决于您的用例的具体要求。如果您选择使用单个队列,您可能要考虑使用锁或其他一些机制来防止对设备的并发访问。如果您选择使用多个队列,您可能需要考虑一种方法来管理可能创建的大量队列。

最后,Redis 和 RabbitMQ 都是与 Celery 一起使用的绝佳选择,它们各有优缺点。 Redis 通常更快、更易于使用,但 RabbitMQ 提供了更高级的功能,例如消息持久性和集群。

© www.soinside.com 2019 - 2024. All rights reserved.