2011-07-05 51 views
33

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:

  1. 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.

  2. 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?

+2

đố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

+1

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

+2

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

Trả lời

0

Tôi đã sử dụng SQS của Amazon cho đề xuất này và có kết quả tốt. Bạn sẽ nhận được tin nhắn cho đến khi bạn sẽ xóa nó khỏi hàng đợi và nó cho phép bạn phát triển ứng dụng của bạn cao như bạn sẽ cần.

+0

SQS của Amazon chậm so với redis và rabbitMQ, và tôi không nghĩ rằng nó hoạt động với cần tây, nhưng tôi có thể sai. –

+0

Cần tây hỗ trợ AmazonSQS - nhưng bài đăng này không trả lời câu hỏi. Thứ tự của tin nhắn có được đảm bảo không? Bạn có thể đảm bảo rằng không có bản sao nào được tạo/xử lý trong hệ thống phân phối, v.v. –

1

Tôi nghi ngờ Celery ràng buộc với các phụ trợ hiện có là giải pháp sai cho độ tin cậy đảm bảo bạn cần.

Cho rằng bạn muốn có hệ thống xếp hàng phân tán có độ bền và độ tin cậy cao, tôi bắt đầu bằng cách tìm kiếm một hệ thống như vậy (chúng tồn tại) và sau đó tìm ra cách tốt nhất để liên kết với nó bằng Python. Điều đó có thể thông qua Celery & một chương trình phụ trợ mới hay không.

+0

Cảm ơn, bạn có biết tên cho hệ thống có hệ thống xếp hàng phân phối có độ bền và độ tin cậy cao không? Tôi muốn kiểm tra chúng. –

+0

Amazon SQS là một. Những người khác tôi không biết - nhưng Google có lẽ là bạn của bạn bây giờ bạn biết câu hỏi để hỏi –

+0

Nhìn vào [MQSeries] (http://publib.boulder.ibm.com/infocenter/wmqv6/v6r0/index.jsp?topic= % 2Fcom.ibm.mq.csqzae.doc% 2Fic10770_.htm) và các sản phẩm tương tự. – michaelok

0

Có sử dụng hệ thống hiển thị phân phối không?Thông thường dành riêng cho HPC nhưng rất nhiều khái niệm đều giống nhau. Kiểm tra Qube hoặc Hạn chót Render. Ngoài ra còn có các giải pháp nguồn mở khác. Tất cả đều có chuyển đổi dự phòng trong tâm trí cho mức độ phức tạp cao và nguy cơ thất bại trong một số ám có thể mất giờ cho mỗi khung chuỗi hình ảnh.

3

Bạn có thể muốn xem IronMQ, nó bao gồm các yêu cầu của bạn (độ bền cao, có sẵn, v.v.) và là giải pháp gốc của đám mây nên không bảo trì. Và có một nhà môi giới Celery cho nó: https://github.com/iron-io/iron_celery để bạn có thể bắt đầu sử dụng nó chỉ bằng cách thay đổi cấu hình Celery của bạn.

+0

Tôi sẽ phải kiểm tra xem nó, nhưng từ những gì tôi nhìn thấy, có vẻ như nó có thể phù hợp với hóa đơn. Cảm ơn. –

5

Rất nhiều thay đổi kể từ khi OP! Bây giờ có một tùy chọn cho hàng đợi có sẵn cao "được nhân đôi". Điều này đi khá xa về phía giải quyết vấn đề bạn mô tả. Xem http://www.rabbitmq.com/ha.html.

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