python - 创建一组流媒体和发布者

标签 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 回调中没有传递任何消息。我正在做的事情是否正确?如果不正确,什么是实现我想要实现的目标的更好方法?

最佳答案

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

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

简单版

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

可靠版本

  • 使用负载平衡器/虚拟 IP 添加多个发现代理以涵盖容错等。
  • 节点应该在定时器上发送发现消息
    • 允许后期加入节点连接
    • 允许连接的节点发现失败的节点(除了依赖 tcp 超时)

混合版

I reality/production 我使用 zeromq 以及任何其他(更合适的)可用服务。这样我就不会试图重新发明轮子(用于发现)而只是 zeromq 用于订阅/数据工作。

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

AWS(作为一个混合示例)

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

  • 带有健康检查的 Route53 (DNS)
  • 云 map (DNS ish)
  • 弹性负载均衡器(任何自定义发现服务的前端)

关于python - 创建一组流媒体和发布者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55169061/

相关文章:

python - 使用 size() 函数保留出现顺序

python - 为什么多个 `for`列表理解的顺序是这样的?

zeromq和python多处理,打开文件过多

python - Pub Sub 只能在一个方向上工作

python - (py)zmq/PUB : Is it possible to call connect() then send() immediately and do not lose the message?

python - Pyplot 上的多个 x 标签

python - 如何在 travis 构建期间更新 tox 上的设置工具

python - ZeroMQ、Redis 和 Gevent

sockets - 如何使用 ZeroMQ 有效地建立点对点 channel ?

zeromq - 如何检查zeromq发送数据是否成功