2012-04-19 25 views
17

Tôi chỉ mới bắt đầu sử dụng django-celery và tôi muốn đặt celeryd hoạt động như một daemon. Tuy nhiên, instructions xuất hiện để gợi ý rằng nó chỉ có thể được định cấu hình cho một trang web/dự án tại một thời điểm. Cây cần tây có thể xử lý nhiều hơn một dự án hay chỉ có thể xử lý một dự án? Và, nếu đây là trường hợp, có cách nào tốt để thiết lập celeryd được tự động bắt đầu cho mỗi cấu hình, điều này đòi hỏi tôi phải tạo một init script riêng cho mỗi cấu hình không?Sử dụng cần tây làm daemon với nhiều ứng dụng django?

Trả lời

8

Giống như tất cả các câu hỏi thú vị, câu trả lời là tùy thuộc vào. :)

Nó chắc chắn có thể đưa ra một kịch bản trong đó celeryd có thể được sử dụng bởi hai trang web độc lập. Nếu nhiều trang web gửi các tác vụ đến cùng một trao đổi và các tác vụ không yêu cầu quyền truy cập vào bất kỳ cơ sở dữ liệu cụ thể nào - giả sử chúng hoạt động trên địa chỉ email hoặc số thẻ tín dụng hoặc thứ gì đó không phải là bản ghi cơ sở dữ liệu đầy đủ. Chỉ cần đảm bảo rằng mã tác vụ nằm trong một mô-đun được chia sẻ được tải bởi tất cả các trang web và máy chủ cần tây.

Thông thường, bạn sẽ thấy cần tây truy cập vào cơ sở dữ liệu - nó tải các đối tượng dựa trên ID được chuyển thành tham số nhiệm vụ hoặc phải viết một số thay đổi cho cơ sở dữ liệu, hoặc, thường xuyên nhất, cả hai. Và nhiều trang web/dự án thường không chia sẻ cơ sở dữ liệu, ngay cả khi chúng chia sẻ cùng một ứng dụng, vì vậy bạn sẽ cần phải giữ hàng đợi nhiệm vụ riêng biệt.

Trong trường hợp đó, điều thường xảy ra là bạn thiết lập một nhà môi giới thư (ví dụ: RabbitMQ) với nhiều trao đổi. Mỗi trao đổi nhận được tin nhắn từ một trang web duy nhất. Sau đó, bạn chạy một hoặc nhiều quy trình celeryd ở đâu đó cho mỗi trao đổi (trong cài đặt cấu hình cần tây, bạn phải chỉ định trao đổi. Tôi không tin rằng celeryd có thể nghe nhiều trao đổi). Mỗi máy chủ celeryd biết trao đổi của nó, các ứng dụng cần tải và cơ sở dữ liệu cần kết nối.

Để quản lý các vấn đề này, tôi khuyên bạn nên xem xét cyme - Đó là bởi @asksol và quản lý nhiều phiên bản celeryd, trên nhiều máy chủ nếu cần. Tôi đã không cố gắng, nhưng có vẻ như nó sẽ xử lý các cấu hình khác nhau cho các trường hợp khác nhau.

1

Chưa thử nhưng sử dụng cần tây 3.1.x mà không cần django-cần tây, theo các tài liệu bạn có thể nhanh chóng một ứng dụng cần tây như thế này:

app1 = Celery('app1') 

app1.config_from_object('django.conf:settings') 
app1.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 


@app.task(bind=True) 
def debug_task(self): 
    print('Request: {0!r}'.format(self.request)) 

Nhưng bạn có thể sử dụng cần tây đa cho tung ra một vài công nhân có cấu hình đơn lẻ, bạn có thể xem ví dụ here. Vì vậy, bạn có thể khởi động một số công nhân với nhau --app appx thông số vì vậy nó sẽ sử dụng taks và các thiết lập khác nhau:

# 3 workers: Two with 3 processes, and one with 10 processes. 
$ celery multi start 3 -c 3 -c:1 10 
celery worker -n [email protected] -c 10 --config celery1.py --app app1 
celery worker -n [email protected] -c 3 --config celery2.py --app app2 
celery worker -n [email protected] -c 3 --config celery3.py --app app3 
Các vấn đề liên quan