2012-06-28 17 views
5

Kịch bản: Chúng tôi có nhiều nút được phân phối theo địa lý mà chúng tôi muốn có hàng đợi thu thập thư cho vị trí đó. Và sau đó chúng tôi muốn gửi dữ liệu đã thu thập này từ mọi hàng đợi trong mỗi nút đến hàng đợi tương ứng của họ ở vị trí trung tâm. Trong nút trung tâm, chúng tôi sẽ lấy ra dữ liệu được thu thập trong hàng đợi (từ các nút khác), xử lý nó và lưu trữ nó liên tục.Đồng bộ hóa một thể hiện hàng đợi với nhiều phiên bản Redis

ràng buộc:

  • dữ liệu là rất quan trọng đối với chúng tôi. Do đó, chúng tôi phải đảm bảo rằng chúng tôi không mất dữ liệu trong mọi trường hợp.
  • Vì vậy, chúng tôi cần hàng đợi liên tục trên mỗi nút để ngay cả khi nút bị lỗi vì lý do ngẫu nhiên, khi chúng tôi đưa nó lên, chúng tôi có dữ liệu được thu thập an toàn với chúng tôi và chúng tôi có thể gửi nó đến nút trung tâm được xử lý.
  • Tương tự, nếu nút trung tâm bị hỏng, dữ liệu phải ở tất cả các nút khác sao cho khi nút trung tâm xuất hiện, chúng tôi có thể gửi tất cả dữ liệu đến nút trung tâm để xử lý.
  • Ngoài ra, dữ liệu trên nút trung tâm không được sao chép hoặc lưu trữ lại. Đó là dữ liệu được thu thập trên một trong các nút nên được lưu trữ trên các nút trung tâm chỉ một lần.
  • Dữ liệu mà chúng tôi đang thu thập là rất quan trọng đối với chúng tôi và thứ tự cung cấp dữ liệu cho nút trung tâm không phải là vấn đề.

chúng tôi Solution Chúng tôi đã xem xét một vài giải pháp trong đó tôi sẽ vào danh sách xuống một trong đó chúng tôi nghĩ rằng sẽ là tốt nhất. Một giải pháp có thể (theo ý kiến ​​của chúng tôi) là sử dụng Redis để duy trì hàng đợi ở khắp mọi nơi vì Redis cung cấp lưu trữ liên tục. Sau đó, có lẽ có một daemon chạy trên tất cả các nút tách biệt về mặt địa lý mà đọc dữ liệu từ hàng đợi và gửi nó đến nút trung tâm. Nút trung tâm khi nhận dữ liệu sẽ gửi một ACK đến nút mà nó nhận được dữ liệu từ (vì dữ liệu rất quan trọng đối với chúng tôi) và sau đó khi nhận được ACK, nút sẽ xóa dữ liệu khỏi hàng đợi. Tất nhiên, sẽ có khoảng thời gian chờ mà ACK phải được nhận.

Vấn đề Các giải pháp đã nêu ở trên (theo chúng tôi) sẽ làm việc tốt nhưng vấn đề là chúng ta không muốn thực hiện các giao thức toàn bộ đồng bộ hóa bởi chính chúng ta với lý do đơn giản rằng chúng ta có thể là sai ở đây. Chúng tôi không thể tìm thấy cách đồng bộ hóa đặc biệt này trong Redis. Vì vậy, chúng tôi đang mở cửa cho hàng đợi dựa trên AMQP khác như RabbitMQ, ZeroMQ, vv Một lần nữa chúng tôi đã không thể tìm ra nếu chúng ta có thể làm điều này với các giải pháp này.

  • Thực hiện các hàng đợi thư hoặc bất kỳ kho dữ liệu nào khác có thể cung cấp giải pháp cho vấn đề của chúng tôi? Nếu có, thì làm thế nào?
  • Nếu không, thì giải pháp của chúng tôi có đủ tốt không?
  • Có ai có thể đề xuất giải pháp tốt hơn không?
  • Có cách nào tốt hơn để thực hiện việc này không?
  • Cách tốt nhất để làm cho nó không an toàn là gì?
  • Dữ liệu mà chúng tôi đang thu thập là rất quan trọng đối với chúng tôi và thứ tự cung cấp dữ liệu cho nút trung tâm không phải là vấn đề.

Trả lời

4

Bạn có thể làm điều này với RabbitMQ bằng cách thiết lập nút trung tâm (hoặc cụm nút) thành người tiêu dùng thông điệp từ các nút khác và sử dụng tính năng xác nhận tin nhắn. Tính năng này có nghĩa là (các) nút trung tâm có thể chuyển phát, do đó các nút khác chỉ xóa các thông báo sau ack. Xem ví dụ: http://www.rabbitmq.com/tutorials/tutorial-two-python.html

Nếu bạn có thêm câu hỏi, vui lòng gửi email danh sách gửi thư thỏmq-thảo luận.

+0

Sử dụng đúng công cụ cho đúng công việc: RabbitMQ chắc chắn là công cụ phù hợp khi bạn cần định tuyến thông báo xác nhận, kiên trì và (nâng cao). – FGRibreau

+0

"Ngoài ra, dữ liệu trên nút trung tâm không được sao chép hoặc lưu trữ lại. Đó là dữ liệu được thu thập trên một trong các nút sẽ chỉ được lưu trữ trên các nút trung tâm một lần". Làm cách nào để đảm bảo điều này? Hãy xem xét rằng ACK không được phân phối do các vấn đề về mạng (trong kịch bản của chúng tôi). Điều gì sẽ xảy ra trong trường hợp đó? Hàng đợi vẫn không nhận thức được tình trạng hoàn thành công việc. Tin nhắn trong trường hợp đó có bị khóa không? Hay một công nhân khác nhặt nó lên? Nếu một nhân viên khác chọn nó, thì chúng tôi sẽ có dữ liệu giống nhau làm việc hai lần, đúng không? – vaidik

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