ZeroMQ:多对一的无回复aynsc消息

时间:2015-08-17 02:22:26

标签: zeromq

我已阅读zguide但未找到我正在寻找的那种模式:

  1. 有一个中央服务器(具有已知端点)和许多客户端(可能来去)。
  2. 客户端不断向服务器发送听力信号,但他们不希望服务器回复。
  3. 服务器接收心跳,但不会回复客户端。
  4. 当客户端和服务器断开连接时发送的Hearbeats应该以某种方式被丢弃,以防止在他们重新上线时发生心跳泛滥。
  5. 我能想到的壁橱是DEALER-ROUTER模式,但由于这是用作异步REQ-REP模式(没有?),我不确定如果服务器刚刚会发生什么对收到的请求保持沉默。"此外,当达到发送高水位标记时,DEALER套接字将阻止而不是开始丢弃心跳,这仍然会导致心跳泛滥。

1 个答案:

答案 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()更新。并实现一些内务处理功能,定期检查旧时间戳的客户端的管理。