2011-08-10 60 views
8

Tôi đang tìm một khung công tác định dạng cron được phân phối cho Python và tìm thấy Cần tây. Tuy nhiên, các tài liệu nói rằng "Bạn phải đảm bảo chỉ có một trình lập lịch biểu đang chạy cho một lịch biểu tại một thời điểm, nếu không bạn sẽ kết thúc với các tác vụ trùng lặp", Celery đang sử dụng celery.beat.PersistentScheduler để lưu lịch biểu vào một tệp cục bộ. Vì vậy, câu hỏi của tôi, là có một thực hiện khác hơn là mặc định có thể đặt lịch "vào cụm" và phối hợp thực hiện nhiệm vụ để mỗi nhiệm vụ chỉ chạy một lần? Không. Mục tiêu của tôi là có khả năng chạy nhanh với lịch trình giống nhau trên tất cả các máy chủ trong cụm.Bộ lập lịch Celery được phân phối

Cảm ơn

Trả lời

0

Tôi nghĩ rằng có thể có một số hiểu lầm về những gì celerybeat làm. Celerybeat không xử lý các nhiệm vụ định kỳ; nó chỉ xuất bản chúng. Nó đặt các nhiệm vụ định kỳ vào hàng đợi để được xử lý bởi các công nhân cần tây. Nếu bạn chạy một quá trình celerybeat đơn lẻ và nhiều quy trình celeryd thì việc thực thi nhiệm vụ sẽ được phân phối vào cụm.

+1

Tôi hiểu rằng, những gì tôi muốn là để có thể chạy nhiều trường celerybeat, vì vậy tôi có thể tránh được rủi ro nếu máy chủ chạy celerybeat sẽ ngừng hoạt động theo lịch trình. I E. một bộ lập lịch nhóm. –

+1

Ok thì câu trả lời là không. Xem https://github.com/ask/celery/issues/251 –

+0

Ok cảm ơn. Quá tệ nó chưa bao giờ làm nó thành 2.3 ... –

0

Chúng tôi gặp vấn đề tương tự khi chúng tôi có ba máy chủ chạy Celerybeat. Tuy nhiên, giải pháp của chúng tôi là chỉ chạy Celerybeat trên một máy chủ duy nhất để các tác vụ trùng lặp không được tạo ra. Tại sao bạn muốn Celerybeat chạy trên nhiều máy chủ?

Nếu bạn lo lắng về việc Celery đi xuống chỉ cần tạo một kịch bản để theo dõi quá trình Celerybeat vẫn đang chạy.

$ ps aux | grep celerybeat 

Điều đó sẽ cho bạn biết nếu quá trình Celerybeat đang chạy. Sau đó, tạo một tập lệnh, nếu bạn thấy quá trình này ngừng hoạt động, hãy gửi email cho quản trị viên hệ thống của bạn. Here's a sample setup nơi chúng tôi chỉ chạy Celerybeat trên một máy chủ.

+3

Không thực sự là một câu trả lời ở đây. Điều này giống như một cách giải quyết khác. Vấn đề phát sinh trong quá trình triển khai, giả sử bạn cần phân phối ứng dụng trên một số nút đồng nhất; chú ý rằng chỉ có một nút chạy bộ lập lịch có nghĩa là có một thủ tục triển khai cho tất cả các nút và một thủ tục triển khai khác chỉ dành cho "nút lập lịch biểu" – Sdra

1

tl; dr: Không có Celerybeat không phù hợp với trường hợp sử dụng của bạn. Bạn phải chạy chỉ một quá trình celerybeat, nếu không công việc của bạn sẽ bị trùng lặp.

Tôi biết đây là câu hỏi rất cũ. Tôi sẽ cố gắng để làm một bản tóm tắt nhỏ bởi vì tôi có cùng một vấn đề/câu hỏi (trong năm 2018).

Một số nền: Chúng tôi đang chạy ứng dụng Django (có cần tây) trong cụm Kubernetes. Cụm (trường hợp EC2) và Pod (~ containers) được tự động lấy mẫu: chỉ cần nói, tôi không biết khi nào và bao nhiêu phiên bản của ứng dụng đang chạy.

Trách nhiệm của bạn là chỉ chạy một quy trình của celerybeat, nếu không, nhiệm vụ của bạn sẽ bị trùng lặp. [1] Có yêu cầu tính năng này trong kho Cần tây: [2]

Yêu cầu người sử dụng để đảm bảo rằng chỉ có một thể hiện của celerybeat tồn tại trên cụm của họ tạo ra một thực hiện đáng kể gánh nặng (hoặc tạo ra một điểm độc lập hoặc khuyến khích người dùng để cuộn mutex được phân phối của riêng họ).

celerybeat phải cung cấp cơ chế ngăn chặn vô tình đồng thời hoặc tài liệu nên đề xuất phương pháp hay nhất .

Sau một thời gian, yêu cầu tính năng này đã bị tác giả của Celery từ chối vì thiếu tài nguyên. [3] I   khuyên bạn nên đọc toàn bộ chuỗi trên Github. Mọi người có khuyên các dự án/giải pháp:

Tôi không thử bất cứ điều gì từ trên (Tôi không muốn một sự phụ thuộc vào ứng dụng của tôi và tôi không thích các tác vụ khóa/bạn cần xử lý lỗi không thành công, v.v.).

Tôi đã sử dụng CronJob ở Kubernetes (https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/).

[1]celerybeat - multiple instances & monitoring

[2]https://github.com/celery/celery/issues/251

[3]https://github.com/celery/celery/issues/251#issuecomment-228214951

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