芹菜任务 /工人分配逻辑



你好stackoverflow人!

我想讨论并查看如何解决问题的更好方法。

我有一个应用程序,该应用程序使用多个协议(FTP(S),SFTP,S3,电子邮件)将文件发送给客户端。

每个目录都有芹菜任务。目录可以发送到多个客户端,并且可以发送到多个目的地。例如dir1-> client1-> ftp和电子邮件(2个任务,并行运行),dir2-> client1和client2->相同的ftp主机名,不同的远程目录(2个任务,并不是很好地运行)。

这很好,但是我有时会导致客户网络拥塞,这是由于多个工人到同一目的地的多个连接,某些客户不知道(或想实现)QoS。

我想拥有一个逻辑,该逻辑不允许连接到同一协议或主机名同时运行的任务。以示例,将发送至2 x S3存储桶的目录应在完成后运行一次。或发送到同一FTP服务器的两个不同目录。

我最初的想法是实现芹菜_Worker队列遥控器。每个帐户的一个队列,协议。和并发1在队列上聆听的设置工人。

想知道你们中的任何一个是否也有类似的挑战,以及如何解决方案。

您提出的解决方案很脆(您真的不应该依靠芹菜并发设置来控制/防止并发执行),并且可能不会解决所有潜在的种族条件(例如,如果Taska,则TaskB在不同的队列中,但需要访问不支持并发访问的资源)。

有相当多的食谱(从非正式的建议到像芹菜(Celery-once)这样的全面液体),以防止并发执行一个给定的任务。他们没有直接解决您自己的问题,但基本上的原理是相同的:具有与任务通信的一些共享锁定机制 - 尝试获取锁,只有一旦锁定就可以运行,当然也会发布。如果您将Redis用作后端,那么它的读取/写入成本相当低,并且"到期"功能确实很有帮助,但是您也可以使用SQL数据库。

最新更新