以指数退避重试 Celery 任务

新手上路,请多包涵

对于这样的任务:

 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(

如果它抛出异常并且我想从守护程序端重试它,如何应用指数退避算法,即在 2^2, 2^3,2^4 等秒之后?

重试是否也是从服务器端维护的,这样如果工人碰巧被杀,那么下一个产生的工人将接受重试任务?

原文由 Quintin Par 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 759
2 个回答

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:
        raise self.retry(exc=exc, countdown=2 ** self.request.retries)

为了防止 Thundering Herd Problem ,您可以考虑在指数退避中添加随机抖动:

 import random
self.retry(exc=exc, countdown=int(random.uniform(2, 4) ** self.request.retries))

原文由 asksol 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏