Python 将消息发送到多个服务器pyzmq
如果我有一个客户端连接到多个服务器,并尝试发送消息Python 将消息发送到多个服务器pyzmq,python,python-2.7,sockets,zeromq,pyzmq,Python,Python 2.7,Sockets,Zeromq,Pyzmq,如果我有一个客户端连接到多个服务器,并尝试发送消息 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") 实际上只有一台服务器会收到消息。声明说pyzmq在所有可用服务器之间执行了一些简单的负载平
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")
实际上只有一台服务器会收到消息。声明说pyzmq在所有可用服务器之间执行了一些简单的负载平衡
是否有一种方法可以将消息发送到所有服务器,而不仅仅是一台服务器?
背景: 我正试图用我的电脑控制一个树莓pis网络。我需要一次向所有人发送消息,但我不能使用PUB/SUB模型,因为这样他们都需要响应该消息 我有一个请求者(主计算机)将请求发送给所有的应答者(raspberry pis),他们都会单独应答。例如,我可以发送一条消息,要求获取温度传感器的读数,我希望所有的树莓PI获取温度传感器的读数并将其发送回。是。 使用适当的正式沟通模式 REQ形式主义确实期望组件通过发送请求来请求其他进程对消息进行响应。因此,
.connect()
与多个exgress目标建立了传输关系,并以循环模式提供服务,以公平队列策略模式依次选择。因此,该组件的工作目的与您要求的不同
解决方案
尝试一些更复杂的正式通信模式,将消息“传播”给所有相关的对等方(PUB/SUB类似),但尝试更复杂、更智能、更安全的派生方案,这将满足您的Raspberry PI解决方案需求
ZeroMQ最大的优势在于它从您那里卸载了底层细节,并为您提供了设计所需的所有分布式可伸缩正式通信模式的强大能力。忘掉ZeroMQ绑定中直接列出的几个基本体(构建块)。考虑您的抽象消息/事件处理方案,然后组装ZeroMQ元素以满足该方案
ZeroMQ[socket]不是从a到B的软管。它更像是与智能正式通信模式节点进行对话的访问端口。您可能会受益,[socket]可以同时在多个传输类上工作。。。因此,您的正式通信模式可以跨越三层网络[TCP://code>+进入[IPC://code>和[INPROC://code>处理[localhost]内的通道
所有工作都是并行的(好的,当然-一旦在较低的细节中检查,几乎是并行的)
所有设备均在平滑的协同集成环境中工作
从哪里来?
为了实现这一点,下一步最好的方法是IMHO获得更多的全局视图,这可能听起来很复杂,因为人们尝试使用ZeroMQ编写代码的前几件事,但如果您至少跳到的第265页,如果不是一步一步阅读的话
有史以来最快的学习曲线是,首先在图60上有一个未公开的视图,重新发布更新和图62HA克隆服务器对,以获得可能的高可用性方法,然后返回根、元素和细节。我刚刚使用了一个req/rep对数组。每个客户端有多个req套接字,每个服务器有一个rep套接字。这不是一个可扩展的解决方案吗?正在发送的数据不需要高可扩展性。如果确实有问题,我可以用pub/sub解决。另一种方法是使用PUSH/PULL
而不是pub/sub
,因为使用pub/sub
方法,如果订阅者没有执行,您的消息可能会丢失,但是当客户端/发送者发布消息时,使用PUSH/PULL
方法(PUSH
),服务器/Getter可以随时使用PULL
属性获取它
下面是一个简单的例子:
客户端代码段:
import zmq
def create_push_socket(ip, port):
print('PUB')
context = zmq.Context()
socket = context.socket(zmq.PUSH)
zmq_address = "tcp://{}:{}".format(ip, port)
socket.connect(zmq_address)
return socket
sock1 = create_push_socket('RPi-1-IP', RPi-1-PORT)
sock2 = create_push_socket('RPi-1-IP', RPi-1-PORT)
sock3 = create_push_socket('RPi-1-IP', RPi-1-PORT)
sock1.send('Hello')
sock2.send('Hello')
sock3.send('Hello')
import zmq
def listen():
context = zmq.Context()
zmq_ = context.socket(zmq.PULL)
zmq_.bind('tcp://*:6667')
print(zmq_.recv())
listen()
服务器端代码段:
import zmq
def create_push_socket(ip, port):
print('PUB')
context = zmq.Context()
socket = context.socket(zmq.PUSH)
zmq_address = "tcp://{}:{}".format(ip, port)
socket.connect(zmq_address)
return socket
sock1 = create_push_socket('RPi-1-IP', RPi-1-PORT)
sock2 = create_push_socket('RPi-1-IP', RPi-1-PORT)
sock3 = create_push_socket('RPi-1-IP', RPi-1-PORT)
sock1.send('Hello')
sock2.send('Hello')
sock3.send('Hello')
import zmq
def listen():
context = zmq.Context()
zmq_ = context.socket(zmq.PULL)
zmq_.bind('tcp://*:6667')
print(zmq_.recv())
listen()
使用PUB/SUB发送请求,使用一个完全独立的PUSH/PULL套接字返回答案。响应消息可能应该包括一个字段,说明它来自哪个Pi。您必须使用pyzmq吗?看来线程和套接字对于您的问题已经足够好了。如果您不需要一个多个REQ/REP是可以的,但是服务器需要知道客户端的数量或者使用一些发现方法。