2013-06-08 41 views
8

Tôi đang gặp phải sự cố sau:ZeroMQ, Máy khách <-> Máy chủ, truyền thông hai hướng có thể với chỉ có khách hàng kết nối với máy chủ lưu trữ?

Tôi có một khách hàng (cuối cùng là khách hàng n) và muốn kết nối với máy chủ. Khách hàng biết địa chỉ máy chủ/máy chủ nhưng máy chủ không biết địa chỉ của (các) khách hàng. Tôi thích để có thể thực hiện các mô hình thông điệp sau đây giữa client-server (cả, khách hàng và máy chủ cần có khả năng để thực hiện các mô hình thông báo sau):

  • Publish Messages (không trả lời dự kiến)
  • Nhận tin nhắn (không trả lời dự kiến)
  • Yêu cầu/nhận tin nhắn (reply dự kiến)
  • điệp Stream (điều này có thể không cần thiết vì nó có thể được phục vụ thông qua các mô hình thông điệp đăng trên)

Một lần nữa điểm quan trọng, và nơi tôi đấu tranh là làm thế nào để kết nối với máy chủ trong khi vẫn có thể gửi và nhận tin nhắn. Máy chủ không có khả năng kết nối với máy khách, nó chỉ có thể chấp nhận các yêu cầu kết nối máy khách. Xin lưu ý rằng tôi không tìm kiếm một giải pháp với proxy/môi giới mà cả khách hàng và máy chủ kết nối nếu không tôi có thể đi trực tiếp với các giải pháp như rabbitmq.

Làm thế nào tôi có thể thực hiện tốt nhất điều này, thậm chí tốt hơn với tham chiếu đến các mẫu mã.

Cảm ơn rất nhiều.

+0

Bạn rõ ràng chưa đọc hướng dẫn ZeroMq; những câu hỏi cơ bản được trả lời chỉ trong phần đầu tiên một mình với các mẫu mã, đọc nó, nó sẽ ngạc nhiên bạn: http://zguide.zeromq.org/page:all – raffian

+2

@Raffian, với tất cả sự tôn trọng, nhưng bạn có thể đã hiểu sai/hiểu lầm câu hỏi của tôi. Không có nghĩa là câu hỏi này được trả lời trong bất kỳ chương đầu tiên của hướng dẫn. Tôi thậm chí không đi qua một mô hình tiên tiến trong hướng dẫn trả lời câu hỏi này. Tôi đã xem qua một số mã của một người khác trên mạng, người đã thực hiện một giải pháp tương tự với những gì tôi đang tìm kiếm với phía trước và phụ trợ trên cả hai, máy chủ và phía khách hàng trên các nhiệm vụ khác nhau và với hai ổ cắm mỗi. Vì vậy, nó là xa tầm thường và sẽ đánh giá cao nếu bạn có thể xem lại câu hỏi của tôi và downvote của bạn. –

+0

Đây là tài liệu tham khảo tôi đã đề cập: http://www.codebullets.com/a-splendid-new-way-of-tcp-messaging-920. Nó không thực hiện nhiều việc gửi tin nhắn một chiều nhưng nó hoàn thành việc gửi tin nhắn hai chiều. Thẩm phán cho chính mình và pls chỉ cho tôi các trang của tài liệu tham khảo của bạn một cái gì đó từ xa tương tự được thực hiện trong hướng dẫn zeromq. –

Trả lời

9

Để kết nối với máy chủ, bạn cần một ổ cắm DEALER ở phía máy khách và ổ cắm ROUTER trên máy chủ. Vì bạn cần một mẫu đăng ký xuất bản, bạn sẽ cần một ổ cắm SUB ở phía máy khách và một ổ cắm PUB ở phía máy chủ.

Client  Server 
+-------+  +--------+ 
| Dealer| <--> | Router | 
| Sub | <-- | Pub | 
+-------+  +--------+ 

Vì vậy, bạn kết nối Bộ định tuyến và ổ cắm Pub, và kết nối Đại lý và Ổ cắm phụ. So với khi bạn muốn:

  • Publish Messages (không trả lời dự kiến): Tạo một phong bì (quán rượu, kênh, thông điệp) và gửi nó thông qua các đại lý, ở phía bên Router router sẽ nhận được phong bì sau (đại lý, quán rượu, kênh, tin nhắn), để bạn có thể xuất bản tin nhắn trên kênh thông qua ổ cắm PUB.

  • Nhận tin nhắn (không trả lời dự kiến): Đó là thực hiện với sự SUB ổ cắm về phía khách hàng, và vì mỗi ấn phẩm đi qua ROUTER bạn có thể dễ dàng thực hiện một cơ chế thuê bao, hoặc chỉ cần thêm một ổ cắm SUB ở phía máy chủ và kết nối (inproc) với ổ cắm PUB (có thể đây là giải pháp sạch hơn).

  • Yêu cầu/nhận tin nhắn (trả lời dự kiến): Có thể thực hiện với Đại lý - Bộ định tuyến. bạn chỉ cần tạo một phong bì khác (req, message), vì vậy Router của bạn (nhận: đại lý, req, tin nhắn) sẽ biết rằng nó cần được xử lý và có thể gửi trả lời cho đại lý. Nếu máy chủ của bạn cần gửi yêu cầu tới khách hàng, bạn chỉ cần theo dõi các khách hàng được kết nối và gửi một phong bì (đại lý, req, msg), để đại lý của bạn có thể trả lời bằng một phong bì (đại diện, thông điệp).

  • Streaming: như bạn đã nêu nó có thể được thực hiện với mô hình xuất bản

Đây là cách tôi sẽ làm điều đó, nếu bạn cần đập trái tim, nó được một chút phức tạp, nhưng không nhiều.

+0

@belazs, Cảm ơn, chỉ cần tự hỏi, nếu tôi không quan tâm đến đăng ký chủ đề không thể tôi chỉ đơn giản là có được đi với một đại lý ở phía khách hàng và router trên phía máy chủ? –

+1

@MattWolf Có, trong ví dụ phụ của tôi chỉ được sử dụng để nhận tin nhắn từ nhà xuất bản. Tôi rất vui vì tôi có thể giúp. – balazs

+0

Tuyệt vời, cảm ơn sự giúp đỡ của bạn –

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