在一个项目中用到了celery,我们用rabbitmq来作为broker,但是发现当rabbitmq挂掉时,celery却无法发送任务,设计到apply_async和delay的代码会一直处在卡住的状态。
也尝试使用celery文档中的BROKER_CONNECTION_TIMEOUT参数,但不起效果,其实官方也说了:
The broker connection timeout only applies to a worker attempting to connect to the broker. It does not apply to producer sending a task, see
broker_transport_options
for how to provide a timeout for that situation.
这个参数仅对worker有用,对任务发送是无用的。很傲娇的是broker_transport_options这个链接中也未提供足够的帮助信息。
继续查找相关信息,在几个项目的issue页面看到些讨论,还是需要对broker_transport_options这个配置传入参数才行,例如:
1 | BROKER_TRANSPORT_OPTIONS = {"max_retries": 3, "interval_start": 0, "interval_step": 0.2, "interval_max": 0.5} |
这段配置意思为:
- 最多重试3次
- 从0秒开始重试
- 每次失败后等待0.2秒后再次进行尝试
- 总尝试时间不超过0.5秒
在项目中使用这个配置后发现确实解决了问题,代码在遇到rabbitmq挂掉的情况下不会再卡住了(因为都是用了kombu,估计对redis作为broker也有效果吧)。
github上的讨论的issue可见:https://github.com/celery/celery/issues/4627#issuecomment-396907957
希望官方早日从代码里面(而不是文档里面)解决问题吧。