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

时间:2012-10-02 01:55:41

标签: redis celery celery-task

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

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

所以我玩了visibility_timeout,如果我将它设置为不到1小时的任何时间,那么我可以看到工作者每X秒获得相同的任务,但是当我将visibility_timeout设置为大于1小时时无论我设定的时间如何,它都会默认为1小时。

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

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

1 个答案:

答案 0 :(得分:7)

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

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

celery flower -b redis://somewhere

而不是像这样:

celery -A proj flower

因为前者意味着不会配置flower实例 使用芹菜配置,然后丢失BROKER_TRANSPORT_OPTIONSvisibility_timeout设置。

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

  • kombu是Celery使用的消息库。

原始回复

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

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

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