我已阅读zguide但未找到我正在寻找的那种模式:
我能想到的壁橱是DEALER-ROUTER模式,但由于这是用作异步REQ-REP模式(没有?),我不确定如果服务器刚刚会发生什么对收到的请求保持沉默。"此外,当达到发送高水位标记时,DEALER套接字将阻止而不是开始丢弃心跳,这仍然会导致心跳泛滥。
答案 0 :(得分:2)
PUSH/PULL
模式应该可以满足您的需求。
# Client example
import zmq
class Client(object):
def __init__(self, client_id):
self.client_id = client_id
ctx = zmq.Context.instance()
self.socket = ctx.socket(zmq.PUSH)
self.socket.connect("tcp://localhost:12345")
def send_heartbeat(self):
self.socket.send(str(self.client_id))
# Server example
import zmq
class Server(object):
def __init__(self):
ctx = zmq.Context.instance()
self.socket = ctx.socket(zmq.PULL)
self.socket.bind("tcp://*:12345)
def receive_heartbeat(self):
return self.socket.recv() # returns the client_id of the message's sender
此PUSH / PULL模式可以根据需要与多个客户端配合使用。服务器应该对收到的消息进行管理(即{client_id : last_received}
这样的字典,每个收到的消息都用datetime.utcnow()
更新。并实现一些内务处理功能,定期检查旧时间戳的客户端的管理。