使用 ZeroMQ 向特定客户端发送回复并在客户端断开连接时排队

Using ZeroMQ to send replies to specific clients and queue if client disconnects

我是 ZeroMQ 的新手,正在尝试解决设计问题。我的场景是我有一个或多个客户端向单个服务器发送请求。服务器将处理请求,做一些事情,并向客户端发送回复。有两个条件:

我很难找出最简单的实现方法。

我尝试过的事情:

我现在的想法是继续PUB/SUB,尝试在客户端实现某种心跳(允许服务器检测客户端的存在),当客户端不再发送心跳时,它将停止发送标有其主题的消息。但这似乎不是最佳选择,并且还会涉及另一个套接字。

对于我可能会采用的任何其他实施方式,是否有任何想法或建议?任何信息,将不胜感激。我在 Python 工作,但任何语言都可以。

要为您的解决方案准备最佳建议,请提供有关您的应用程序要求的更多数据。我对你的情况做了一些研究,并结合我对ZMQ的经验,这里我提出两种可能性:

1) PUSH/PULL双向模式,对可扩展性影响较大,但来自服务器的消息将被缓存。

服务器有一个 PULL 套接字来注册每个客户端并从客户端获取所有消息。每条消息都应该有客户端 ID,以便服务器知道发送响应的位置。

为每个客户端-服务器创建 PUSH 套接字以发送响应。套接字配置已在注册消息中发送。您也可以使用 REQ/REP 模式来注册客户端(分配套接字号)。

每个客户端都有自己的 PULL 套接字,其配置已在注册消息中发送到服务器。

表示需要三个客户端的服务器(例如[]中的端口号):

  • 服务器:1 x PULL[5555] 套接字,3 x PUSH[5560,5561,5562] 套接字(+可选的 1 X REQ[5556] 套接字用于注册,但我认为这取决于您准备客户端身份的方式)
  • 客户端:1 x PUSH[5555] 套接字,1 x PULL[5560|5561|5562](每个客户端一个)(+ 可选 1 X REP[5556]

您必须将服务器连接到多个客户端套接字才能发送响应,但如果客户端断开连接,消息不会丢失。当客户端重新连接到他们的 PULL 套接字时,客户端将收到他们自己的消息。缺点是要求在服务器端(客户端数量)创建很少的 PUSH 套接字。

2) PUB/SUB + PUSH/PULL or REQ/REP, server端的静态cocket配置(只有2个),但是server必须准备一些重传或缓存消息的机制。

服务器创建 PUB 套接字和 PULLREQ。客户端通过 PULLREQ 套接字注册它的身份。服务器将使用此身份作为过滤器向客户端发布所有消息。服务器在 PUB 套接字上使用 monitor() 函数来计算连接和断开连接的客户端数量(操作:'accept' 和 'disconnect')。 'disconnect' 动作服务器向所有客户端发布消息后再次注册。对于没有重新注册的客户端,服务器停止发布消息。

客户端创建 SUB 套接字和 PUSHREQ 来注册和发送请求。

此解决方案可能需要在服务器端进行一些缓存。客户端可以在从 SUB 套接字获取消息后确认每条消息。它更复杂,必须与您的要求相关联。如果你只是想知道那个客户丢失了消息。客户端可以发送注册期间从服务器收到的最后一条消息的时间戳。如果您需要保证客户端获得所有消息,则需要一些缓存实现。也许其他订阅所有消息并删除每个消息的进程都经过客户端确认。

在此解决方案中,服务器需要三个客户端([] 中的示例端口号):

  • server: 1 x PUB[5555] socket, 1 x REP or PULL[5560] socket + monitoring PUB socket
  • client: 1 x SUB[5555] socket and own identity for filter, 1 x REQ or PUSH[5560] socket

关于监控,您可以在此处阅读:https://github.com/JustinTulloss/zeromq.node#monitoring(NodeJS 实现,但 Python 类似)


我考虑过其他模式,但我不确定 ROUTER/DEALERREQ/REP 是否能满足您的要求。您应该阅读更多关于模式的内容,因为对于某些解决方案而言,每种模式都更好。看这里: