Tôi có một ứng dụng python nơi tôi muốn bắt đầu làm nhiều công việc hơn trong nền để nó sẽ mở rộng tốt hơn khi nó bận rộn hơn. Trong quá khứ tôi đã sử dụng Celery để thực hiện các tác vụ nền bình thường, và điều này đã làm việc tốt.Làm thế nào để đảm bảo gửi tin nhắn với cần tây?
Sự khác biệt duy nhất giữa ứng dụng này và những người khác mà tôi đã làm trong quá khứ là tôi cần đảm bảo rằng các thư này được xử lý, chúng không thể bị mất.
Đối với ứng dụng này tôi không quá lo lắng về tốc độ cho hàng đợi tin nhắn của tôi, tôi cần độ tin cậy và độ bền đầu tiên và formost. Để được an toàn, tôi muốn có hai máy chủ xếp hàng, cả hai trong các trung tâm dữ liệu khác nhau trong trường hợp có sự cố, một bản sao lưu của người khác.
Nhìn vào Celery, có vẻ như nó hỗ trợ một loạt các chương trình phụ trợ khác nhau, một số có nhiều tính năng hơn sau đó là các tính năng khác. Hai cái nhìn phổ biến nhất như redis và RabbitMQ nên tôi dành chút thời gian để kiểm tra chúng.
RabbitMQ: Hỗ trợ hàng đợi bền và clustering, nhưng vấn đề với cách họ có phân nhóm hiện nay là nếu bạn bị mất một nút trong cluster, tất cả thư trong nút đó không có sẵn cho đến khi bạn mang lại nút đó trở lại trực tuyến . Nó không sao chép các thông điệp giữa các nút khác nhau trong cụm, nó chỉ sao chép siêu dữ liệu về thông báo, và sau đó nó quay trở lại nút gốc để nhận thông báo, nếu nút không chạy, bạn là S.O.L. Không lý tưởng. Cách họ đề nghị để giải quyết vấn đề này là thiết lập một máy chủ thứ hai và tái tạo hệ thống tập tin bằng DRBD, và sau đó chạy một cái gì đó như máy tạo nhịp tim để chuyển máy khách đến máy chủ sao lưu khi cần. Điều này có vẻ khá phức tạp, không chắc chắn nếu có một cách tốt hơn. Bất cứ ai biết một cách tốt hơn?
Redis: Hỗ trợ một nô lệ đọc và điều này sẽ cho phép tôi có một bản sao lưu trong trường hợp khẩn cấp nhưng nó không hỗ trợ thiết lập master-master, và tôi không chắc chắn nếu nó xử lý failover active giữa tổng thể và nô lệ. Nó không có các tính năng giống như RabbitMQ, nhưng trông dễ dàng hơn nhiều trong việc thiết lập và bảo trì.
Câu hỏi:
là gì cách tốt nhất để thiết lập cần tây để nó sẽ đảm bảo thông điệp chế biến.
Có ai đã làm điều này trước đây không? Nếu vậy, có thể chia sẻ những gì bạn đã làm không?
đối với chuyển đổi thỏmq, tôi nghe tin đồn rằng một cái gì đó đơn giản hơn sẽ sớm có! – asksol
Redis có thể bền nếu bạn đặt cài đặt append_only. Nhưng redis vẫn không hỗ trợ thông báo xác nhận, có nghĩa là một tin nhắn được gửi lại nếu nhân viên không ack nó. Hỗ trợ Celery redis mô phỏng điều này, nhưng chỉ có thể thực hiện ở phía máy khách, điều đó có nghĩa là bất kỳ thông điệp nào chưa được giải quyết có thể bị mất nếu nhân viên bị giết đột ngột hoặc bị mất điện. Xem http://ask.github.com/celery/faq.html#should-i-use-retry-or-acks-late – asksol
Có thể bạn sẽ không bị mất tin nhắn nếu bạn đặt CELERY_DISABLE_RATE_LIMITS = True, đặt CELERYD_PREFETCH_MULTIPLIER = 1, đặt CELERY_ACKS_LATE = True và chạy với nhóm solo. Nhưng sẽ phải xác minh điều đó. – asksol