1. ホーム
  2. python

[解決済み] 指数関数的なバックオフを伴うCeleryタスクの再試行

2023-06-01 01:14:04

質問

このようなタスクの場合

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 などの秒数後?

また、リトライはサーバ側で維持され、ワーカーが殺された場合、次に生まれるワーカーがリトライタスクを引き受けるのでしょうか?

どのように解決するのですか?

この 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)

を防ぐために 雷の群れ問題 を防ぐために、指数関数的バックオフにランダムなジッターを追加することを検討してもよいでしょう。

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