我正在创建一个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
答案 0 :(得分:7)
编辑:使用kombu *连接到同一Redis URL的任何消息使用者
将帮助恢复未经处理的消息,因此您必须确保所有这些消息
配置了相同的visibility_timeout
值。
一个常见的错误就是像这样启动Flower监视器:
celery flower -b redis://somewhere
而不是像这样:
celery -A proj flower
因为前者意味着不会配置flower实例
使用芹菜配置,然后丢失BROKER_TRANSPORT_OPTIONS
和visibility_timeout
设置。
除此之外,您还必须确保挂钟 使用ntp同步,如下面原始回复中所述。
原始回复:
即使我没有听说过这样的事情,但这可能是一个错误。
我向kombu/transport/redis.py
添加了一些打印语句,以检查visibility_timeout是否设置正确,这绝对适合我。测试它使用超过一小时的值会花费更多的时间(准确地说大约2个小时),所以我可以报告。
同时你可以通过自己添加print语句来验证你是否正确设置了visiblity_timeout(例如redis传输中的restore_visible方法)
请注意,此功能正在使用时间戳,因此如果您有多台计算机,则时钟几乎同步非常重要(特别是不要按小时漂移)。 您应该始终在联网服务器上使用ntp并定期进行同步。