[解決済み] 指数関数的なバックオフを伴う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))
関連
-
[解決済み】celery / rabbitmqで保留中のタスクを全て削除する。
-
[解決済み] Pythonの構文に新しいステートメントを追加することはできますか?
-
[解決済み] dict を txt ファイルに書き、それを読み取る?
-
[解決済み] SQLAlchemy: 日付フィールドをフィルタリングする方法は?
-
[解決済み] Django で全てのリクエストヘッダを取得するにはどうすれば良いですか?
-
[解決済み] CSVデータを処理する際、1行目のデータを無視する方法を教えてください。
-
[解決済み] virtualenv の `--no-site-packages` オプションを元に戻す。
-
[解決済み] PySparkでデータフレームのカラムをString型からDouble型に変更する方法は?
-
[解決済み] Python 言語を決定するには?
-
[解決済み] Pythonの辞書にあるスレッドセーフについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pythonです。未束縛のメソッドを束縛する?
-
[解決済み] Pythonでコード行間にかかる時間を測定するには?
-
[解決済み] Pythonのインスタンス変数とクラス変数
-
[解決済み] SQLAlchemy: 日付フィールドをフィルタリングする方法は?
-
[解決済み] なぜ(0-6)は-6=偽なのか?重複
-
[解決済み] データフレームをソートした後にインデックスを更新する
-
[解決済み] Pythonで、ウェブサイトが404か200かを確認するためにurllibをどのように使用しますか?
-
[解決済み] if 節の終了方法
-
[解決済み] Pythonの辞書にあるスレッドセーフについて
-
[解決済み] データクラスとtyping.NamedTupleの主な使用例