Khi Nhiệm Vụ Celery Biến Mất Vào Vô Hình

By hientd, at: 11:40 Ngày 26 tháng 9 năm 2025

Thời gian đọc ước tính: __READING_TIME__ phút

When Celery Tasks Disappear into the Void
When Celery Tasks Disappear into the Void

 

Giới thiệu

 

Mỗi nhà phát triển Django đều đã gặp phải vấn đề này: bạn gọi task.delay() với sự tự tin… và không có gì xảy ra. Không có lỗi, không có nhật ký, không có kết quả - chỉ là sự im lặng. Giống như nhiệm vụ của bạn đã bị một lỗ đen nuốt chửng.

 

Hãy gặp “Nhiệm vụ ma,” một lỗi khó chịu len lỏi vào khoảng trống khi Celery không được thiết lập hoặc giám sát chính xác.

 

Bối cảnh: Một nhiệm vụ bị mất

 

Một nhà phát triển lên lịch thông báo email bằng send_email_task.delay(user.id). Mọi thứ trông có vẻ ổn. Nhưng người dùng không nhận được email. Nhật ký không hiển thị gì. Giám sát bình thường. Nhiệm vụ ma đã tấn công.

 

Nguyên nhân phổ biến của “Nhiệm vụ ma” 👻

 

  1. Worker không chạy

     

    • Các Celery worker chưa được khởi động (celery -A project worker -l info).
       

    • Nhiệm vụ được đưa vào hàng đợi, nhưng không ai lắng nghe.
       

  2. Cấu hình Broker sai

     

    • CELERY_BROKER_URL sai.
       

    • Redis/RabbitMQ không chạy hoặc kết nối hết thời gian.
       

  3. Vấn đề import nhiệm vụ

     

    • Celery không bao giờ phát hiện ra nhiệm vụ (cấu hình ứng dụng sai)
       

    • Thiếu trình trang trí @shared_task decorator.
       

  4. Thiếu Result Backend

     

    • Nhiệm vụ thực sự chạy, nhưng bạn không thể thấy kết quả vì không có backend nào được đặt.

 

Gỡ lỗi nhiệm vụ ma

 

  • Kiểm tra worker: ps aux | grep celery
     

  • Kiểm tra hàng đợi: celery -A project inspect active
     

  • Giám sát broker: Redis CLI (redis-cli monitor) hoặc bảng điều khiển RabbitMQ.
     

  • Bật ghi nhật ký: Chạy Celery với -l debug để xem luồng nhiệm vụ.

 

Khắc phục

 

# 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}")

 

Luôn luôn:

 

  • Khởi động worker trước khi kiểm thử
     

  • Xác nhận broker đang hoạt động
     

  • Thêm giám sát (Flower, Sentry, hoặc Prometheus)

 

 

Bài học kinh nghiệm

 

Sự im lặng của Celery là dối trá. Một worker bị thiếu hoặc broker được cấu hình sai có thể nuốt chửng các nhiệm vụ của bạn mà không báo trước. Luôn luôn giám sát hàng đợi, xác thực thiết lập của bạn và thêm thử lại.

Tag list:

Theo dõi

Theo dõi bản tin của chúng tôi và không bao giờ bỏ lỡ những tin tức mới nhất.