重试芹菜任务与指数退出
对于这样的任务:
from celery.decorators import task @task() def add(x, y): if not x or not y: raise Exception("test error") return self.wait_until_server_responds(
如果它抛出一个exception,我想从守护进程重试它,如何应用指数退避algorithm,即2^2, 2^3,2^4
等秒后?
也是从服务器端维护的重试,如果工人碰巧遇害,那么下一个产生的工作人员将采取重试任务?
task.request.retries
属性包含到目前为止的尝试次数,所以您可以使用它来实现指数回退:
from celery.task import task @task(bind=True, max_retries=3) def update_status(self, auth, status): try: Twitter(auth).update_status(status) except Twitter.WhaleFail as exc: self.retry(exc=exc, countdown=2 ** self.request.retries)
为了防止雷鸣群体问题 ,您可以考虑在指数回退中添加随机抖动:
import random self.retry(exc=exc, countdown=int(random.uniform(2, 4) ** self.request.retries))
从Celery 4.2开始(尚未发布),您可以将您的任务configuration为自动使用指数回退: http : //docs.celeryproject.org/en/master/userguide/tasks.html#automatic-retry-for -known的例外
@app.task(autoretry_for=(Exception,), retry_backoff=2) def add(x, y): ...
不要被“4.1版本的新特性”所迷惑。 在文档中公布,它还没有发布,请参阅合并请求