Tính năng lên lịch nghe đơn giản: đến giờ thì đổi trạng thái bài viết. Nhưng trong thực tế có rất nhiều điều có thể sai.
Đừng để hiển thị phụ thuộc vào tác vụ nền
Truy vấn công khai kiểm tra cả trạng thái lẫn thời điểm xuất bản. Bài đã lên lịch tự hiển thị đúng giờ, kể cả khi worker đang bận hay tạm dừng.
Post.objects.filter(
status__in=["published", "scheduled"],
published_at__lte=timezone.now(),
)Tác vụ định kỳ phải idempotent
Celery Beat gọi tác vụ mỗi phút. Tác vụ chỉ cập nhật những dòng vẫn còn ở trạng thái scheduled, nên hai worker chạy song song không bao giờ xuất bản trùng.
updated = Post.objects.filter(
pk=pk, status="scheduled", published_at__lte=now
).update(status="published")Làm mới cache
Khi có bài được xuất bản, tác vụ tăng số phiên bản nội dung trong Redis. Mọi trang công khai đã cache trước đó lập tức trở nên vô hiệu.
Kiểm thử
Viết test với thời gian giả lập: bài lên lịch trong tương lai không xuất hiện, tua thời gian qua mốc thì xuất hiện, chạy tác vụ hai lần vẫn chỉ ghi một hoạt động.