创建一组彩带和发布者

时间:2019-03-14 17:50:54

标签: python zeromq pyzmq

我有许多节点将使用辅助服务来通知彼此的地址。我希望能够发布信息,以便所有其他节点都能听到它。我不希望使用XPUB套接字,因为我希望分发该系统。

我尝试过的东西总结为:

1 创建一个PUB套接字,

def pub_stream(self):
     self.pub = self.context.socket(zmq.PUB)
     self.pub.bind(self.endpoint)

2 创建一个SUB流,

def sub_stream(self):
    ioloop = IOLoop.instance()
    socket = self.context.socket(zmq.SUB)
    self.sub_stream = ZMQStream(socket, ioloop)
    self.sub_stream.on_recv(self.on_message)
    self.subs_stream.setsockopt(zmq.SUBSCRIBE, self.topic)

3 在某个时候接收所有其他节点的地址并连接到它们,

# close and restart sub_stream to get rid of any previous connections
for endpoint in endpoints:
    self.sub_stream.connect(endpoint)

尽管没有消息通过on_message回调传递。我正在做的事情正确吗?如果不是,那是我要实现的更好的方法?

1 个答案:

答案 0 :(得分:0)

无论您决定使用哪种路由,除非可以访问多播等,否则至少需要一个固定地址才能连接。

我将有一个简单的X(pub / sub)代理作为我的独立发现网络,允许新节点根据主题决定其他哪些感兴趣的节点。

简单版本

  • 创建单个XSUB / XPUB代理,并在每侧具有固定地址(DNS等)
  • 节点启动
    • 连接到代理的XSUB端口并广播其主题,地址和数据端口
    • 连接到XPUB端口并订阅感兴趣的节点
      • 返回连接信息后,它将根据连接信息将其数据套接字连接到节点的数据套接字。

可靠的版本

  • 添加具有负载均衡器/虚拟IP的多个发现代理,以覆盖容错等。
  • 节点应在计时器上发送发现消息
    • 允许后期加入节点进行连接
    • 允许连接的节点发现失败的节点(而不依赖tcp超时)

混合版本

现实/生产中,我使用zeromq以及其他可用的(更合适的)服务。这样一来,我就不会试图重新发明轮子(用于发现),而只是为了订阅/数据工作而使用zeromq。

例如,如果我要使用云提供商在许多地区分发我的系统,为什么不使用它们提供的发现服务。

AWS(作为一个混合示例)

对于AWS,我使用以下组件来允许发现/可靠性/故障转移

  • 具有运行状况检查的Route53(DNS)
  • 云图(DNS ish)
  • 弹性负载平衡器(任何自定义发现服务的前端)