我有许多节点将使用辅助服务来通知彼此的地址。我希望能够发布信息,以便所有其他节点都能听到它。我不希望使用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
回调传递。我正在做的事情正确吗?如果不是,那是我要实现的更好的方法?
答案 0 :(得分:0)
无论您决定使用哪种路由,除非可以访问多播等,否则至少需要一个固定地址才能连接。
我将有一个简单的X(pub / sub)代理作为我的独立发现网络,允许新节点根据主题决定其他哪些感兴趣的节点。
现实/生产中,我使用zeromq以及其他可用的(更合适的)服务。这样一来,我就不会试图重新发明轮子(用于发现),而只是为了订阅/数据工作而使用zeromq。
例如,如果我要使用云提供商在许多地区分发我的系统,为什么不使用它们提供的发现服务。
对于AWS,我使用以下组件来允许发现/可靠性/故障转移