我正在构建一个Web应用程序(使用Python / Django),该应用程序托管在连接到负载均衡器的两台计算机上。
我有一台中央存储服务器,一台主机上有一台中央Redis服务器,一个celery beat和两个celery worker。
我从API端点(在任何主机上)接收文件,然后计划要复制到存储服务器的任务。
问题在于任务是通过以下方式安排的:
task.delay(args)
然后任何工作人员都可以接收它,而接收到的文件仅存在于两台计算机中的一台上,并且必须从其中复制。
我尝试查找是否可以为工作人员分配唯一的ID,但可以在文档中找不到任何帮助。
对此有什么解决办法?鉴于托管计算机的数量可以扩展到超过2。
答案 0 :(得分:2)
最好的解决方案是将任务放在命名队列中,并让每个工作人员从其特定队列中查找作业。因此,如果您拥有计算机A和计算机B,则可以拥有队列A,队列B和共享队列。机器A将在队列A和共享队列上监视作业,而机器B将在队列B和共享队列上查找作业。
答案 1 :(得分:1)
执行此操作的最佳方法是为每个工作人员设置一个专用队列。
当我学习Celery时,我确实做到了这一点,并且在几年后完全放弃了这种方法,因为它产生了比实际解决的问题更多的问题。
相反,我建议以下内容:您可能需要在任务之间共享的任何资源都应该位于共享文件系统(NFS)上,或者位于某种内存中缓存服务中,例如Redis,KeyDb或memcached。我们将S3和Redis结合使用,具体取决于资源的类型。
当然,如果您不太在意可伸缩性,那么“按队列工作”方法将可以正常工作。