当达到eta时,连续多次执行具有长eta(8小时以上)的芹菜任务

use*_*317 15 redis celery celery-task

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

我知道这与设置BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': X}X是以秒为单位的数字有关.

所以我玩了visibility_timeout,如果我把它设置为不到1小时的任何时间,那么我可以看到工作者每X秒获得相同的任务,但是当我将visibility_timeoutX 设置为大于1小时时,它会保持默认为1h而不管我设定的时间.

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

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

ask*_*sol 7

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

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

celery flower -b redis://somewhere
Run Code Online (Sandbox Code Playgroud)

而不是像这样:

celery -A proj flower
Run Code Online (Sandbox Code Playgroud)

因为前者意味着花卉实例不会配置芹菜配置,然后丢失BROKER_TRANSPORT_OPTIONSvisibility_timeout设置.

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

  • kombu是Celery使用的消息库.

原始回复:

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

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

请注意,此功能正在使用时间戳,因此如果您有多台计算机,则时钟几乎同步非常重要(特别是不要按小时漂移).您应该始终在联网服务器上使用ntp并定期进行同步.