【问题标题】:Celery task / worker assignment logic芹菜任务/工人分配逻辑
【发布时间】:2019-07-08 08:24:24
【问题描述】:

大家好!

我想讨论一下,看看有什么更好的方法来解决我的问题。

我有一个使用多种协议(FTP(S)、SFTP、S3、电子邮件)向客户端发送文件的应用程序。

每个目录都有一个 celery 任务。一个目录可以发送到多个客户端,也可以发送到多个目的地。例如dir1 -> client1 -> FTP 和 EMail(2 个任务,可以并行运行),dir2 -> client1 AND client2 -> 相同的 FTP 主机名,不同的远程目录(2 个任务,不能并行运行)。

这工作正常,但有时我会导致客户端网络拥塞,由于多个工作人员到同一目的地的多个连接,一些客户端不知道(或想要实施)QOS。

我想要一个逻辑,不允许连接到相同协议或主机名的任务同时运行。例如,发送到 2 个 S3 存储桶的目录应该运行一次,完成后第二次将启动。或者两个不同的目录被发送到同一个 FTP 服务器。

我最初的想法是实现一个 celery_worker 队列远程控制。每个帐户,协议一个队列。并设置具有并发 1 的工作人员侦听队列。

想知道你们中是否有人遇到过类似的挑战,以及你们是如何解决的。

【问题讨论】:

  • 所以要理解你可以通过不同的协议并行发送文件到同一个客户端,但是不能通过相同的协议并行发送到多个客户端,对吧?
  • 协议可以并行化,我不能并行化发送到同一服务器的文件。

标签: python python-3.x celery celery-task


【解决方案1】:

您提出的解决方案相当脆弱(您真的不应该依赖 celery 并发设置来控制/防止并发执行)并且可能无法解决所有潜在的竞争条件(例如,如果 taskA 和 taskB 在不同的队列中但需要访问不支持并发访问的资源)。

有很多方法(从相当非正式的建议到成熟的库,如 celery-once)来防止并发执行一个给定任务。它们不能直接解决您自己的问题,但基本上原理是相同的:具有一些与任务通信的共享锁机制 - 尝试获取锁,仅在获得后运行,当然释放它。如果你使用 Redis 作为结果后端,它的读/写成本相当低,而且它的“过期”功能真的很有帮助,但你也可以只使用你的 SQL 数据库。

【讨论】:

    猜你喜欢
    • 2016-10-22
    • 2016-03-31
    • 1970-01-01
    • 2013-11-09
    • 2014-07-14
    • 2023-04-08
    • 2011-12-29
    • 2021-02-21
    • 2017-04-23
    相关资源
    最近更新 更多