将任务发送给特定的芹菜工作者

时间:2019-11-14 15:32:10

标签: python django redis celery celerybeat

我正在构建一个Web应用程序(使用Python / Django),该应用程序托管在连接到负载均衡器的两台计算机上。

我有一台中央存储服务器,一台主机上有一台中央Redis服务器,一个celery beat和两个celery worker。

我从API端点(在任何主机上)接收文件,然后计划要复制到存储服务器的任务。

问题在于任务是通过以下方式安排的:

task.delay(args)

然后任何工作人员都可以接收它,而接收到的文件仅存在于两台计算机中的一台上,并且必须从其中复制。

我尝试查找是否可以为工作人员分配唯一的ID,但可以在文档中找不到任何帮助。

对此有什么解决办法?鉴于托管计算机的数量可以扩展到超过2。

2 个答案:

答案 0 :(得分:2)

最好的解决方案是将任务放在命名队列中,并让每个工作人员从其特定队列中查找作业。因此,如果您拥有计算机A和计算机B,则可以拥有队列A,队列B和共享队列。机器A将在队列A和共享队列上监视作业,而机器B将在队列B和共享队列上查找作业。

答案 1 :(得分:1)

执行此操作的最佳方法是为每个工作人员设置一个专用队列

当我学习Celery时,我确实做到了这一点,并且在几年后完全放弃了这种方法,因为它产生了比实际解决的问题更多的问题。

相反,我建议以下内容:您可能需要在任务之间共享的任何资源都应该位于共享文件系统(NFS)上,或者位于某种内存中缓存服务中,例如Redis,KeyDb或memcached。我们将S3和Redis结合使用,具体取决于资源的类型。

当然,如果您不太在意可伸缩性,那么“按队列工作”方法将可以正常工作。