2012-02-15 23 views
15

Tôi đang tìm giải pháp được khuyến nghị để làm việc xung quanh celerybeat là một điểm thất bại duy nhất để triển khai cần tây/thỏmq. Tôi đã không tìm thấy bất cứ điều gì có ý nghĩa cho đến nay, bằng cách tìm kiếm trên web.Làm việc xung quanh celerybeat là một điểm duy nhất của sự thất bại

Trong trường hợp của tôi, một lần lên lịch hẹn giờ khởi động một chuỗi công việc có thể chạy trong nửa ngày hoặc lâu hơn. Vì chỉ có thể có một trường hợp celerybeat, nếu một cái gì đó xảy ra với nó hoặc máy chủ đang chạy, các công việc quan trọng sẽ không được chạy.

Tôi hy vọng đã có giải pháp làm việc cho điều này, vì tôi không thể là người duy nhất cần lịch trình đáng tin cậy (nhóm hoặc tương tự). Tôi không muốn sử dụng một số loại lịch trình được cơ sở dữ liệu hỗ trợ, nếu tôi không phải làm như vậy.

Trả lời

5

Có một vấn đề mở trong cần tây github repo về điều này. Không biết nếu họ đang làm việc trên nó mặc dù.

Cách giải quyết khác là bạn có thể thêm khóa cho các tác vụ để chỉ có 1 phiên bản của PeriodicTask cụ thể sẽ chạy cùng một lúc.

Cái gì như:

if not cache.add('My-unique-lock-name', True, timeout=lock_timeout): 
    return 

Tìm ra thời gian chờ khóa là tốt, khéo léo. Chúng tôi đang sử dụng nhiệm vụ 0,9 * run_every giây nếu các celerybeats khác nhau sẽ cố gắng chạy chúng vào các thời điểm khác nhau. 0,9 chỉ để lại một số lợi nhuận (ví dụ: khi cần tây hơi chậm so với lịch trình một lần, sau đó đúng tiến độ sẽ khiến khóa vẫn hoạt động).

Sau đó, bạn có thể sử dụng phiên bản celerybeat trên tất cả các máy. Mỗi nhiệm vụ sẽ được xếp hàng đợi cho mọi trường hợp celerybeat nhưng chỉ một nhiệm vụ của chúng sẽ kết thúc chạy.

Công việc vẫn sẽ tôn trọng run_every theo cách này - trường hợp xấu nhất: nhiệm vụ sẽ chạy ở tốc độ 0.9 * run_every.

Một vấn đề với trường hợp này: nếu nhiệm vụ được xếp hàng nhưng không được xử lý theo thời gian đã lên lịch (ví dụ vì bộ xử lý hàng đợi không khả dụng) - thì khóa có thể được đặt sai thời gian khiến 1 nhiệm vụ tiếp theo không chạy. Để giải quyết vấn đề này, bạn sẽ cần một loại cơ chế phát hiện nào đó cho dù nhiệm vụ ngày càng nhiều về thời gian.

Tuy nhiên, đây không phải là tình huống phổ biến khi sử dụng trong sản xuất.

Một giải pháp khác là phân lớp bộ lập lịch celerybeat và ghi đè phương pháp đánh dấu của nó. Sau đó, cho mỗi đánh dấu thêm một khóa trước khi xử lý nhiệm vụ. Điều này làm cho chắc chắn rằng chỉ cần các bộ phận cần tây có cùng nhiệm vụ định kỳ sẽ không xếp hàng các tác vụ giống nhau nhiều lần. Chỉ có một celerybeat cho mỗi đánh dấu (một người thắng điều kiện chủng tộc) sẽ xếp hàng nhiệm vụ. Trong một celerybeat đi xuống, với đánh dấu tiếp theo một số khác sẽ giành chiến thắng trong cuộc đua.

Điều này tất nhiên có thể được sử dụng kết hợp với giải pháp đầu tiên.

Tất nhiên điều này để làm việc phụ trợ bộ nhớ cache cần phải được nhân rộng và/hoặc chia sẻ cho tất cả các máy chủ.

Đó là một câu hỏi cũ nhưng tôi hy vọng nó sẽ giúp mọi người.

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