2012-03-28 37 views
11

Làm thế nào để bạn ngăn chặn Celery thực hiện một nhiệm vụ định kỳ trước khi thực hiện trước đó đã hoàn thành?Làm thế nào để đảm bảo một nhiệm vụ Celery là ngăn chặn thực thi nhiệm vụ Celery chồng chéo

Tôi có một cụm máy chủ, được liên kết với một máy chủ cơ sở dữ liệu chung, thực hiện các nhiệm vụ Celery và tôi thấy mỗi máy chủ đôi khi có thể chạy cùng một tác vụ cùng lúc cũng như các máy chủ khác nhau chạy cùng một tác vụ đó cùng một lúc. Điều này gây ra rất nhiều điều kiện chủng tộc đang làm hỏng dữ liệu của tôi theo những cách tinh tế đau đớn.

Tôi đã đọc qua Celery's docs, nhưng tôi không thể tìm thấy bất kỳ tùy chọn nào cho phép điều này rõ ràng. Tôi tìm thấy một similar question, nhưng sửa chữa được đề xuất có vẻ như một hack, vì nó dựa trên khung bộ nhớ đệm của Django, và do đó có thể không được chia sẻ bởi tất cả các máy chủ trong một cụm, cho phép nhiều máy chủ vẫn thực hiện cùng một nhiệm vụ cùng một lúc.

Có tùy chọn nào trong Celery để ghi lại tác vụ nào hiện đang chạy trong cơ sở dữ liệu và không chạy lại cho đến khi bản ghi cơ sở dữ liệu bị xóa không?

Tôi đang sử dụng các mô-đun Django-Cần tây, và mặc dù nó cung cấp trang/admin/djcelery/taskstate/và/admin/djcelery/workerstate /, tôi đã không bao giờ thấy bất kỳ nhiệm vụ hoặc công nhân lâu dài xuất hiện ở đó.

Trả lời

2

Nếu tôi là bạn, tôi sẽ thiết lập một hàng đợi đặc biệt cho bất kỳ công việc nào không thể thực hiện đồng thời. Sau đó, bạn chỉ có thể khởi động một nhân viên riêng biệt chỉ cho hàng đợi đó.

3

Cách tiêu chuẩn là sử dụng khóa chia sẻ thông qua cơ chế bộ nhớ cache chuẩn django. Xem this recipe từ tài liệu chính thức

+0

Và như tôi đề cập, đó không phải là một cơ chế mạnh mẽ trong cài đặt cụm ... Tại sao không có tùy chọn sử dụng cơ sở dữ liệu? – Cerin

+0

Sử dụng phụ trợ ghi nhớ và bạn sẽ nhận được chức năng cụm –

+1

@AlexLebedev, đó là một điểm tốt, nhưng * nếu và chỉ khi * các máy trong cụm chia sẻ phần phụ trợ. Ví dụ, nó không phải là không thể tưởng tượng để chạy memcached tại địa phương và sử dụng một localhost memcached phụ trợ trên mỗi hộp. Một cách hợp lý rõ ràng nhưng tôi chỉ muốn chỉ ra nó vì sợ rằng bất cứ ai nghĩ rằng "oh, tôi đang sử dụng memcached, giải quyết vấn đề." – mrooney

Các vấn đề liên quan