1、简介
- 自动重试 :Celery允许任务在失败后自动重试。可以通过
retry
方法或者任务装饰器中的autoretry_for
参数来启用自动重试。 - 重试延迟 :可以设置重试的延迟时间,让任务在一段时间后再重试。
retry
方法中的countdown
参数或任务装饰器中的retry_backoff
参数都可以设置延迟。 - 重试次数 :可以限制任务的最大重试次数,避免任务无限制地重试。
max_retries
参数用于设置最大重试次数。 - 自定义重试逻辑 :可以通过捕获异常并调用
retry
方法来自定义重试逻辑。这样可以根据任务的具体情况决定是否重试以及如何重试。
2、autoretry_for
from celery import shared_task
@shared_task(autoretry_for=(Exception,), retry_backoff=True, retry_backoff_max=700, max_retries=5)
def mul(x, y):
result = x * y
# 模拟任务失败
if result == 10:
raise ValueError('Invalid result')
return result
autoretry_for
: 指定哪些异常会触发自动重试。通常是一个异常类的元组。retry_backoff
: 启用指数退避策略。如果设置为True
,每次重试的间隔时间会按指数级增长。 **retry_backoff_max
: 指定指数退避策略的最大重试间隔时间,以秒为单位。max_retries
: 指定任务的最大重试次数。超过这个次数后,任务将不再重试。retry_jitter
: 启用抖动(jitter),在重试间隔时间上增加一些随机性,避免同时重试的任务过多。默认为True。
3、指数退避策略
指数退避策略(Exponential Backoff)是一种重试策略,通常用于网络请求、任务处理等需要重试的场景。该策略会在每次重试失败后增加重试间隔时间,从而避免频繁的重试可能引起的资源浪费或系统过载。
在 Celery 中,使用 retry_backoff=True
可以启用指数退避策略,使任务在每次重试失败后按照指数级增长的间隔时间重新尝试执行。
指数退避策略的工作原理:
- 初始重试间隔时间:通常从一个基础时间间隔(例如 1 秒)开始。
- 每次重试的间隔时间:每次重试的时间间隔会根据指数级增长,例如,第一次重试后等待 1 秒,第二次重试等待 2 秒,第三次重试等待 4 秒,依此类推。
- 最大重试间隔:可以设置一个最大重试间隔时间,以避免重试间隔时间无限增长。
4、retry
from celery import shared_task
@shared_task(bind=True, max_retries=3, default_retry_delay=10)
def add(self, x, y):
try:
result = 2+3
# 模拟任务失败
if result == 5:
raise ValueError('Invalid result')
return result
except ValueError as e:
print(e)
# 使用默认的重试延迟和最大重试次数
raise self.retry(exc=e)
bind=True
: 将任务与当前实例绑定,这样可以在任务内部使用self.retry
方法。max_retries
: 指定任务的最大重试次数。超过这个次数后,任务将不再重试。default_retry_delay
: 默认重试延迟时间,单位为秒。retry_jitter
: 在重试间隔时间上增加一些随机性,避免同时重试的任务过多。默认为True。
retry
方法参数:
exc
: 传递引发重试的异常实例。countdown
: 指定下次重试的延迟时间(以秒为单位)。如果没有提供,则使用default_retry_delay
。max_retries
: 覆盖任务定义中的max_retries
值。
评论列表,共 0 条评论
暂无评论