2013-08-20 45 views
12

Tôi đang thử nghiệm ZeroMQ dưới dạng bản đồ phụ (kiểu dịch vụ xe buýt) cho một hệ thống trung bình. Chúng tôi có khoảng 50 nút, tất cả chúng phải là nhà xuất bản và người đăng ký. Mạng là loại cấu trúc liên kết hình sao, nhưng các cạnh "nói chuyện" với nhau. Chúng tôi yêu cầu khám phá động (không cần phải mã hóa cứng địa chỉ mạng của những người tham gia) mà không có SPOF (Điểm duy nhất của lỗi).Khám phá động ZeroMQ Pub-Sub + mà không có một người hòa giải

Tôi đã đọc http://zeromq.org/whitepapers:0mq-3-0-pubsub và từ những gì tôi hiểu, cách 0MQ được đề xuất để khám phá động liên quan đến nút proxy (XPUB/XSUB) chuyển tiếp đăng ký và ấn bản. Tôi đã xem xét sử dụng proxy như một trung gian trung gian trong hệ thống của mình, tuy nhiên, tôi có những mối quan tâm sau với kiến ​​trúc này: (A) Nút proxy là SPOF - khi không hoạt động được toàn bộ hệ thống không hoạt động (B) Tất cả lưu lượng truy cập, bao gồm dữ liệu, đi qua nút proxy, có nghĩa là vấn đề hiệu suất độ trễ &.

Giả sử tôi đã hiểu chính xác báo cáo chính về pub-sub, có cách nào tương đối đơn giản để đạt được pub-sub + dynamic-discovery + no-SPOF trong ZeroMQ không?

Điểm bổ sung: Tôi đã loại trừ giải pháp đa hướng (PGM) vì hầu hết các thư có một/vài bên quan tâm và chúng tôi không muốn quá tải mạng.

Trả lời

8

Nhiều người đăng ký với một nhà xuất bản duy nhất không yêu cầu phải trung gian vì người đăng ký có thể nói chuyện trực tiếp với nhà xuất bản. Nhưng nhiều nhà xuất bản và người đăng ký cùng một lúc không dễ dàng như vậy; trừ khi có điều gì đó ở giữa, việc bảo trì sẽ là một cơn ác mộng khi người đăng ký mới phải được định cấu hình với tất cả các nhà xuất bản hiện có.

Bạn có thể triển khai một số proxy XSUB/XPUB, mỗi máy trên máy của riêng họ, sau đó triển khai trình cân bằng tải (như F5) giữa nhà xuất bản và proxy. Điều này đạt được cân bằng tải và khả năng chịu lỗi ở phía thượng nguồn.

Mã proxy là đơn giản:

Socket frontend = context.socket(ZMQ.XSUB); 
frontend.bind("tcp://proxy1:5444"); 
Socket backend = context.socket(ZMQ.XPUB); 
backend.bind("tcp://proxy1:5555"); 
frontend.subscribe("".getBytes()); 
ZMQ.proxy (frontend, backend, null); 

Nếu một nút Proxy thất bại, chỉ khởi động lại nó; các kết nối lại/đăng ký phải được xử lý tự động theo zmq.

Đối với thuê bao hạ lưu, kết nối mỗi thuê bao trực tiếp đến tất cả các proxy có sẵn:

subscriber = ctx.createSocket(ZMQ.SUB) 
subscriber.connect("tcp://proxy1:5555") 
subscriber.connect("tcp://proxy2:5555") 
subscriber.connect("tcp://proxy3:5555") 

Nhà xuất bản sẽ đến và đi thường xuyên hơn proxy, vì vậy kết nối thuê bao trực tiếp đến proxy kết quả trong bảo trì cấu hình ít vì số lượng các proxy sẽ, đối với hầu hết các phần, là tĩnh.

Nếu nút proxy không thành công, LTM tuyến thượng lưu định tuyến lưu lượng truy cập tương ứng với các nút proxy còn lại; các thuê bao sẽ không bị ảnh hưởng vì chúng tiêu thụ từ tất cả các proxy có sẵn.

Người đăng ký chậm có thể được giải quyết bằng đồng bộ hóa, đọc trên this.
Kiểm tra đăng ký-forwading và giảm thiểu lưu lượng truy cập mạng here.

enter image description here

+0

Thật sự tôi không hiểu điều gì đó trong giải pháp đề xuất: Khi bất kỳ thuê bao đặt mua, các Round Robin DNS sẽ chuyển hướng thông điệp đăng ký vào một số LTM, mà sẽ chuyển hướng nó vào một số (duy nhất?) Proxy đó sẽ giữ đăng ký.Nếu máy proxy này bị treo, đăng ký sẽ bị mất, phải không? – dux2

+0

Cảm ơn. Trong giải pháp này, làm thế nào để bạn tránh cấu hình tĩnh danh sách các nhà xuất bản trong mỗi proxy? Làm thế nào để bạn xử lý một nhà xuất bản muộn tham gia? Tôi có thể nghĩ rằng một nhà xuất bản "thông báo" sự tồn tại của nó cho mỗi proxy khi bắt đầu và sau đó proxy gửi tất cả các đăng ký cho nhà xuất bản mới. Proxy khôi phục từ sự cố như thế nào? nó phải yêu cầu đăng ký lại từ tất cả người đăng ký hoặc đăng ký liên tục. Điều này là tất cả có thể, nhưng rất nhiều mã để viết, gần giống như phát triển pub-sub của riêng bạn từ đầu. – dux2

+0

Được cập nhật một lần nữa, hy vọng nó sẽ giúp ích. – raffian