セロリタスクが消え失せる時
By hientd, at: 2025年9月26日11:40
Estimated Reading Time: __READING_TIME__ minutes


はじめに
すべてのDjango開発者は経験しているでしょう。task.delay()
を自信を持って呼び出すと…何も起こらないのです。エラーもログも結果も何もなく、ただ沈黙。まるでタスクがブラックホールに飲み込まれたかのようです。
「ゴーストタスク」 と出会う時が来ました。これは、Celeryが正しく設定または監視されていない場合に、虚空に漂い込むずる賢いバグです。
状況:見つからないタスク
開発者はsend_email_task.delay(user.id)
でメール通知をスケジュールします。すべて問題ないように見えます。しかし、ユーザーはメールを受け取りません。ログには何も表示されません。監視も正常です。「ゴーストタスク」が発生しました。
「ゴーストタスク」👻のよくある原因
-
ワーカーが実行されていない
-
Celeryワーカーが開始されていません(
celery -A project worker -l info
)。
-
タスクはキューに入れられているが、誰も聞いていない。
-
-
ブローカーの誤設定
-
間違ったCELERY_BROKER_URL。
-
-
タスクのインポートに関する問題
-
Celeryがタスクを検出しません(アプリの設定が間違っている)
-
@shared_task デコレーターがない。
-
-
結果バックエンドがない
-
タスクは実際には実行されるが、バックエンドが設定されていないため、結果を見ることができない。
-
ゴーストのデバッグ
-
ワーカーを確認する:
ps aux | grep celery
-
キューを検査する:
celery -A project inspect active
-
ブローカーを監視する:Redis CLI(
redis-cli monitor
)またはRabbitMQダッシュボード。
-
ロギングを有効にする:タスクの流れを見るために、-l debugを付けてCeleryを実行する。
修正
# settings.py
CELERY_BROKER_URL = "redis://localhost:6379/0"
CELERY_RESULT_BACKEND = "redis://localhost:6379/0"
# tasks.py
from celery import shared_task
@shared_task
def send_email_task(user_id):
print(f"Sending email to user {user_id}")
常に:
-
テスト前にワーカーを起動する
-
ブローカーが稼働していることを確認する
-
監視を追加する(Flower、Sentry、またはPrometheus)
教訓
Celeryの沈黙は欺瞞的です。ワーカーが見つからないか、ブローカーの構成が間違っていると、警告なしにタスクが飲み込まれる可能性があります。常にキューを監視し、設定を検証し、再試行を追加してください。