【问题标题】:ZeroMQ broadcast to specific PULL client across firewallZeroMQ 跨防火墙广播到特定的 PULL 客户端
【发布时间】:2022-02-05 21:59:24
【问题描述】:

我正在构建一个消息代理,它通过 ZeroMQ PUSH/PULL 套接字与客户端进行通信,并且能够将客户端从他们未从服务器端订阅的消息中排除(与 ZeroMQ pub 不同/sub 排除客户端的消息)。

目前,我通过以下方式实现它:

  1. 服务器:在固定端口上绑定 ZeroMQ PULL 套接字
  2. 客户端:在随机或固定端口上绑定 ZeroMQ PULL 套接字
  3. 客户端:连接到服务器的 PULL 套接字并发送包含新客户端地址和端口的握手消息。
  4. 服务器:接收来自客户端的握手并将 PUSH 套接字连接到客户端的 PULL 服务器。向客户端的套接字发送握手响应。
  5. 客户端:收到握手。已连接!

现在客户端和服务器可以双向通信,服务器只能向特定的客户端子集发送消息。效果很好! 但是,如果绑定 PULL 套接字的客户端无法在其防火墙中打开端口以便服务器可以连接到它们,则此模型不起作用。如何通过最少的重新架构来解决这个问题(因为当前模型在可以正确配置防火墙的情况下运行良好)

我考虑过以下几点:

  • 路由器/经销商模式?我对此一无所知,而且我发现的文档很少。
  • 某种transport bridging?链接示例提供了 PUB/SUB 示例。

我希望从比我更了解 ZeroMQ 的人那里得到一些建议。

tl;dr:我实现了一个消息代理,它通过双向推/拉套接字与客户端通信。每个客户端绑定一个 PULL 套接字,服务器保存一个 PUSH 套接字映射,以便它可以寻址特定的订阅者。如何处理阻止客户端端口的防火墙?

【问题讨论】:

    标签: sockets networking network-programming zeromq


    【解决方案1】:

    您可以像您说的那样使用路由器/经销商来执行此操作。默认情况下,ROUTER 套接字跟踪它拥有的每个连接。这样做的方法是让调用者将连接身份信息粘贴在它收到的每条消息的前面。这使得 pub/sub 之类的事情变得相当简单,因为您需要做的就是处理一些由 DEALER 套接字发送的消息服务器端。过去我做过类似的事情

    1.) 服务器端是一个 ROUTER 套接字。 ROUTER 处理来自 DEALER 套接字 SUB/UNSUB 的 2 条消息。这与作为帧的第一部分发送的身份信息一起允许路由器知道客户端感兴趣的消息。 2.) 服务器检查映射以查看应该使用映射向哪些客户端发送特定类型的数据,然后通过再次将身份附加到消息的开头将消息转发给正确的客户端。

    这很好,因为它允许在服务器上公开单个端口。客户端我们不需要暴露端口,只需连接到服务器 ROUTER 套接字即可。

    请参阅https://zguide.zeromq.org/docs/chapter3/ 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-04
      • 2010-12-18
      • 2017-09-08
      • 1970-01-01
      相关资源
      最近更新 更多