达到 eta 时,长 eta(8 小时以上)的 celery 任务会连续执行多次

Posted

技术标签:

【中文标题】达到 eta 时,长 eta(8 小时以上)的 celery 任务会连续执行多次【英文标题】:celery tasks with long eta (8+ hours) are executed multiple times in a row when eta is reached 【发布时间】:2012-09-22 21:48:12 【问题描述】:

我正在创建一个 eta 介于 3 到 20 小时之间的任务,当我查看工作人员日志时,对于这个任务,工作人员在收到原始任务后每小时都会说“Got task from broker: ...”,直到 eta 达到到达。

我知道这与设置 BROKER_TRANSPORT_OPTIONS = 'visibility_timeout': X 有关,其中 X 是以秒为单位的数字。

所以我使用了 visibility_timeout,如果我将其设置为小于 1 小时,那么我可以看到工作人员每 X 秒执行一次相同的任务,但是当我将 visibility_timeout 设置为 X 大于 1 小时时,它无论我设置的时间如何,都默认为 1 小时。

还有其他人遇到这个问题吗?这是一个已知的错误吗?

我正在使用 Celery 3.0.11(Chiastic Slide) 使用 Redis 服务器版本 2.4.15

【问题讨论】:

我刚刚也遇到了这个错误,在 Redis 服务器 v.2.4.6 上运行 Celery v.3.0.19,但即使在与 Redis 服务器在同一台机器上运行的工作人员也会发生这种情况。 也观察到了。 celery==3.0.21 django-celery==3.0.21 Python 2.7.3,Redis 服务器版本 2.2.12。 .在同一台机器上运行。 在 celery 3.1.17、Redis 服务器 2.8.4 中也遇到了这个错误,即使 Redis 和 worker 在同一台机器上运行也是如此。 也经历过这个celery==4.3.0,redis==3.2.1,Redis server v=6.0.9,一个小时后我安排了12个任务而不是1个。我在本地单机上运行它 【参考方案1】:

编辑:任何使用 kombu* 的消息消费者都连接到同一个 Redis URL 将有助于恢复未确认的消息,因此您必须确保所有这些消息 配置了相同的visibility_timeout 值。

一个常见的错误是像这样启动 Flower 监视器:

celery flower -b redis://somewhere

而不是这样:

celery -A proj flower

因为前者意味着不会配置花实例 使用 celery 配置,然后缺少 BROKER_TRANSPORT_OPTIONSvisibility_timeout 设置。

除此之外,您还必须确保挂钟 使用 ntp 进行同步,如下面的原始回复所述。

kombu 是 Celery 使用的消息传递库。

原始回复

尽管我没有听说过这样的事情,但它可能是一个错误。 我向kombu/transport/redis.py 添加了一些打印语句,以检查visibility_timeout 是否设置正确,这绝对适合我。测试它是否适用于大于一小时的值将需要更多时间(确切地说大约需要 2 小时),所以我可以在那时报告。

同时,您可以通过自己添加 print 语句来验证您是否正确设置了 visiblity_timeout(例如,添加到 redis 传输中的 restore_visible 方法)

请注意,此功能使用时间戳,因此如果您拥有多台机器,重要的是时钟几乎同步(尤其是不偏离小时)。 您应该始终在联网服务器上使用 ntp 并定期同步。

【讨论】:

我检测了kombu/transport/redis.py 并且visibility_timeout 确实设置正确。将 redis 服务器和 celery worker 移动到单机解决了这个问题。我检查了以前的机器,它们是同步的(例如,两者的系统时间和日期是相同的) 用新的细节更新了答案!

以上是关于达到 eta 时,长 eta(8 小时以上)的 celery 任务会连续执行多次的主要内容,如果未能解决你的问题,请参考以下文章

深度学习在美团配送ETA预估中的探索与实践-笔记

深度学习在美团配送ETA预估中的探索与实践-笔记

深度学习在美团配送ETA预估中的探索与实践-笔记

ETA啥意思

学习惯用 Haskell 的资源(eta 缩减、符号中缀运算符、库等)[关闭]

R语言Eta squared计算实战:Eta squared表示可以用模型中给定的变量解释的方差的比例拟合方差分析模型(two-way ANOVA)计算Eta Squared