celery 系列:重试机制(2)

1、简介

  1. 自动重试 :Celery允许任务在失败后自动重试。可以通过retry方法或者任务装饰器中的autoretry_for参数来启用自动重试。
  2. 重试延迟 :可以设置重试的延迟时间,让任务在一段时间后再重试。retry方法中的countdown参数或任务装饰器中的retry_backoff参数都可以设置延迟。
  3. 重试次数 :可以限制任务的最大重试次数,避免任务无限制地重试。max_retries参数用于设置最大重试次数。
  4. 自定义重试逻辑 :可以通过捕获异常并调用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
  1. autoretry_for : 指定哪些异常会触发自动重试。通常是一个异常类的元组。
  2. retry_backoff : 启用指数退避策略。如果设置为 True,每次重试的间隔时间会按指数级增长。 **
  3. retry_backoff_max : 指定指数退避策略的最大重试间隔时间,以秒为单位。
  4. max_retries : 指定任务的最大重试次数。超过这个次数后,任务将不再重试。
  5. 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)
  1. bind=True : 将任务与当前实例绑定,这样可以在任务内部使用 self.retry 方法。
  2. max_retries : 指定任务的最大重试次数。超过这个次数后,任务将不再重试。
  3. default_retry_delay : 默认重试延迟时间,单位为秒。
  4. retry_jitter : 在重试间隔时间上增加一些随机性,避免同时重试的任务过多。默认为True。

retry 方法参数:

  • exc : 传递引发重试的异常实例。
  • countdown : 指定下次重试的延迟时间(以秒为单位)。如果没有提供,则使用 default_retry_delay
  • max_retries : 覆盖任务定义中的 max_retries 值。

发表评论

评论列表,共 0 条评论

    暂无评论