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