Từ sự hiểu biết của tôi, Celery là một hàng đợi nhiệm vụ phân tán, có nghĩa là điều duy nhất mà nó nên làm là gửi nhiệm vụ/công việc đến các máy chủ khác và nhận kết quả. RabbitMQ là một hàng đợi tin nhắn, và không có gì hơn. Tuy nhiên, một nhân viên chỉ có thể nghe MQ và thực hiện nhiệm vụ khi nhận được tin nhắn. Điều này đạt được chính xác những gì Celery cung cấp, vậy tại sao cần Celery?Tại sao sử dụng Celery thay vì RabbitMQ?
Trả lời
Bạn nói đúng, bạn không cần Celery chút nào. Khi bạn đang thiết kế một hệ thống phân tán có rất nhiều lựa chọn và không có cách nào đúng để làm những việc phù hợp với mọi tình huống.
Nhiều người nhận thấy rằng linh hoạt hơn để có các nhóm người tiêu dùng tin nhắn chờ thông báo xuất hiện trên hàng đợi, thực hiện một số công việc và gửi tin nhắn khi công việc kết thúc.
Cần tây là một khung kết thúc nhiều thứ trong một gói nhưng nếu bạn không thực sự cần toàn bộ gói, thì tốt hơn hết là thiết lập RabbitMQ và thực hiện những gì bạn cần mà không cần phải phức tạp. Ngoài ra, RabbitMQ có thể được sử dụng trong nhiều tình huống hơn ngoài kịch bản hàng đợi nhiệm vụ mà Celery thực hiện.
Nhưng nếu bạn chọn Celery, hãy suy nghĩ kỹ về RabbitMQ. Mô hình xếp hàng tin nhắn của Celery rất đơn giản và nó thực sự phù hợp hơn với Redis so với RabbitMQ. Thỏ có một tập hợp các tùy chọn phong phú mà Celery về cơ bản bỏ qua.
Celery về cơ bản cung cấp giao diện đẹp để thực hiện đúng những gì bạn đã nói và đề cập đến tất cả cấu hình cho bạn. Có, bạn có thể làm điều đó bằng tay, nhưng bạn chỉ cần viết lại cần tây.
Ngoài ra còn có yếu tố hoạt động. Các bộ phận lớn của Celery là có độ tin cậy (ví dụ: không bị rơi khi một ngoại lệ cụ thể được đăng, vv), và quản lý công nhân, và các cụm công nhân. – asksol
- 1. Tại sao sử dụng AMQP/ZeroMQ/RabbitMQ
- 2. Tại sao nên sử dụng Function.prototype.bind thay vì Function.prototype.call?
- 3. Tại sao sử dụng registerDefaults: thay vì setValue: forKey :?
- 4. tại sao nó sử dụng movl thay vì đẩy?
- 5. Tại sao RTP sử dụng UDP thay vì TCP?
- 6. Tại sao sử dụng singleton thay vì lớp tĩnh?
- 7. Tại sao sử dụng tai thay vì chiến tranh?
- 8. Tại sao sử dụng ROLAP thay vì MySQL đơn giản?
- 9. Tại sao sử dụng Enums thay vì Constants?
- 10. Tại sao nên sử dụng GWT.create() thay vì mới?
- 11. Tại sao sử dụng singleton thay vì phương pháp tĩnh?
- 12. Tại sao sử dụng jQuery trên() thay vì nhấp chuột()
- 13. Tại sao UnderscoreJS sử dụng toString.call() thay vì typeof?
- 14. Tại sao memo.Lines sử dụng TStrings thay vì TStringList?
- 15. Android: tại sao phải sử dụng getBaseContext() thay vì
- 16. Tại sao sử dụng char [] thay vì String?
- 17. Tại sao sử dụng var thay vì tên lớp?
- 18. Tại sao sử dụng tăng :: ice_or thay vì || và tăng :: ice_and thay vì && trong enable_if?
- 19. Tại sao Celery không tắt sạch?
- 20. Tại sao darcs thay vì git?
- 21. Tại sao chặn thay vì lặp?
- 22. Tại sao CHỌN 0, ... thay vì CHỌN
- 23. Có cách nào khiến Celery/RabbitMQ bền bỉ không?
- 24. Tại sao FloatBuffer thay vì phao []?
- 25. Tại sao testFixture thay vì TestClass?
- 26. Sử dụng nội tại AVX thay vì SSE không cải thiện tốc độ - tại sao?
- 27. Tại sao NDEBUG thay vì RELEASE?
- 28. Tại sao nhập javax.swing. * Thay vì java.swing. *
- 29. Tại sao cụm từ thông dụng của Ruby sử dụng \ A và \ z thay vì^và $?
- 30. Làm sao để Jersey sử dụng SLF4J thay vì JUL?
"Thỏ có một tập hợp các tùy chọn phong phú mà Celery về cơ bản bỏ qua". Đó là sự thật nhưng một chút sai lầm. Ví dụ, bạn có thể thiết lập các quy tắc định tuyến trong lớp Rabbit không được kiểm soát bởi Celery, nhưng ảnh hưởng đến việc định tuyến và tiêu thụ các nhiệm vụ Celery. Đó là một vấn đề thiết kế cho dù bạn muốn định tuyến được xử lý bởi người gọi, bộ định tuyến tùy chỉnh Celery hay cơ chế trao đổi. Đúng là những cấu hình Rabbit có thể "vô hình" với Celery nhưng điều đó không có nghĩa là chúng không có tác dụng hữu ích. –