如果我有一个客户端连接到多个服务器,并尝试发送消息,
socket = context.socket(zmq.REQ)
socket.connect ("tcp://127.0.0.1:5565")
socket.connect ("tcp://127.0.0.1:5566")
socket.connect ("tcp://127.0.0.1:5567")
socket.send("Hello all")
实际上只有一台服务器会收到消息。 documentation说 pyzmq 在所有可用服务器之间执行一些简单的负载平衡。
有没有办法向所有服务器发送消息,而不仅仅是一个服务器?
背景:
我正在尝试用我的电脑控制树莓派网络。我需要一次向所有人发送一条消息,但我不能使用 PUB/SUB 模型,因为那样他们都需要回复该消息。
我有一个请求者(主计算机)向所有回复者(树莓派)发送请求,他们都单独回复。例如,我可以发送一条消息,要求从温度传感器获取读数,我希望所有覆盆子 pis 都读取温度传感器并将其发回。
最佳答案
是的。
使用适当的正式沟通模式。
ZMQ.REQ 形式主义确实期望组件通过发送 REQUEST 请求其他进程做一些工作以响应消息。因此,.connect()
与其建立传输关系的多个导出目标以循环模式提供服务,在公平队列中一个接一个地选择-政策模式。因此该组件可以正常工作,但目的与您要求的不同。
解决方案
尝试一些更复杂的正式通信模式,将消息“传播”到所有相关对等点(类似 PUB/SUB),但更复杂、更智能、故障安全的派生方案将满足您的 Raspberry PI 解决方案需求。
ZeroMQ 的最大优势在于它为您减轻了低级细节的负担,让您拥有巨大的能力来设计您需要的所有必需的分布式可扩展正式通信模式。忘掉 ZeroMQ 绑定(bind)中直接列出的几个原语(构建 block )吧。考虑您的抽象消息/事件处理方案,然后组装 ZeroMQ 元素以满足该方案。
ZeroMQ [套接字] 不是从 A 到 B 的软管。它更像是与智能正式通信模式节点进行对话的访问端口。您可能会受益,[socket] 可以同时在许多传输类上工作...因此您的正式通信模式 可能跨越 L3 网络[ TCP:]
+ 进入 [localhost] 内的 [IPC:]
和 [INPROC:]
进程到进程 channel 。
所有并行工作(好吧,当然 - 一旦仔细检查,几乎是并行的)
所有工作都在流畅的协同集成环境中进行。
从哪里采购?
您可能为此做的最好的下一步是恕我直言,以获得更多的全局 View ,这对于尝试使用 ZeroMQ 编码的前几件事来说可能听起来很复杂,但如果您至少跳转到 页面Code Connected, Volume 1 [asPdf->] 的 265 ,如果不是在那里一步步阅读的话。
有史以来最快的学习曲线是首先拥有未公开的 View 图 60重新发布更新和< strong>图 62 HA 克隆服务器对 一种可能的高可用性方法,然后回到根源、元素和细节。
关于python - 将消息发送到多个服务器pyzmq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24788360/