17

我正在创建一个 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)

4

1 回答 1

9

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

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

celery flower -b redis://somewhere

而不是这样:

celery -A proj flower

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

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

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

原回复

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

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

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

于 2012-10-02T12:25:35.433 回答