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


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” 👻
-
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.
-
-
Cấu hình Broker sai
-
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.
-
-
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.