你好,stackoverflow的人!
我想讨论一下,看看有什么更好的方法来解决我的问题。
我有一个应用程序,该应用程序使用多种协议(FTP(S),SFTP,S3,电子邮件)将文件发送到客户端。
每个目录有一个芹菜任务。目录可以发送到多个客户端,也可以发送到多个目的地。例如dir1-> client1-> FTP和电子邮件(2个任务,可以并行运行),dir2-> client1和client2->相同的FTP主机名,不同的远程目录(2个任务,不能并行运行)。
这工作正常,但是有时由于多个工作人员到同一个目标的多个连接而导致客户端网络拥塞,有些客户端不知道(或不想实现)QOS。
我希望有一种逻辑,不允许连接到同一协议或主机名的任务同时运行。例如,正在发送到2 x S3存储桶的目录应该运行一次,完成后第二个目录将启动。或正在发送到同一FTP服务器的两个不同目录。
我的最初想法是实现celery_worker队列远程控制。每个帐户,协议一个队列。并设置并发性为1的工作人员在队列上侦听。
想知道您是否遇到过类似的挑战,以及如何解决它。
答案 0 :(得分:1)
您提出的解决方案非常脆弱(您实际上不应该依赖celery并发设置来控制/阻止并发执行),并且可能不会解决所有潜在的竞争条件(例如,如果taskA和taskB在不同的队列中,但是需要访问不支持并发访问的资源。
有很多食谱(从非正式建议到像celery-once这样的成熟库)可以防止同时执行一个给定任务。它们并不能直接解决您自己的问题,但是基本原理是相同的:具有一些与任务进行通信的共享锁机制-尝试获取锁,仅在获得锁后运行,然后释放它。如果您将Redis用作结果后端,则其读/写成本相当低,并且它的“过期”功能确实很有用,但是您也可以只使用SQL数据库。