はじめに

すべてのDjango開発者は経験しているでしょう。task.delay()を自信を持って呼び出すと…何も起こらないのです。エラーもログも結果も何もなく、ただ沈黙。まるでタスクがブラックホールに飲み込まれたかのようです。

「ゴーストタスク」 と出会う時が来ました。これは、Celeryが正しく設定または監視されていない場合に、虚空に漂い込むずる賢いバグです。

状況:見つからないタスク

開発者はsend_email_task.delay(user.id)でメール通知をスケジュールします。すべて問題ないように見えます。しかし、ユーザーはメールを受け取りません。ログには何も表示されません。監視も正常です。「ゴーストタスク」が発生しました。

「ゴーストタスク」👻のよくある原因

  1. ワーカーが実行されていない

    • Celeryワーカーが開始されていません(celery -A project worker -l info)。
       

    • タスクはキューに入れられているが、誰も聞いていない。
       

  2. ブローカーの誤設定

  3. タスクのインポートに関する問題

  4. 結果バックエンドがない

    • タスクは実際には実行されるが、バックエンドが設定されていないため、結果を見ることができない。

ゴーストのデバッグ

  • ワーカーを確認する: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の沈黙は欺瞞的です。ワーカーが見つからないか、ブローカーの構成が間違っていると、警告なしにタスクが飲み込まれる可能性があります。常にキューを監視し、設定を検証し、再試行を追加してください。