【发布时间】:2015-10-23 08:32:11
【问题描述】:
我是 ZeroMQ 的新手,并试图找出一个设计问题。我的场景是我有一个或多个客户端向单个服务器发送请求。服务器将处理请求,做一些事情,并向客户端发送回复。有两个条件:
- 回复必须发送给发送请求的客户端。
- 如果客户端断开连接,服务器应该将消息排队一段时间,以便客户端重新连接时,它可以接收它错过的消息。
我很难找出最简单的方法来实现它。
我尝试过的事情:
PUB/SUB - 我可以用主题标记回复,以确保只有发送请求(以主题作为标识符)的订阅者才能收到正确的回复。这解决了路由问题,但由于发布者不知道订阅者,它对断开连接的客户端一无所知。
PUSH/PULL - 似乎能够处理消息队列问题,但看起来它不支持我将消息发送到特定客户端的计划(例如,基于他们的 ID)。
ROUTER/DEALER - 设计似乎是两者的解决方案,但所有示例似乎都相当复杂。
我现在的想法是继续PUB/SUB,尝试在客户端实现某种心跳(让服务器检测到客户端的存在),当客户端不再发送心跳时,它会停止发送带有其主题的消息。但这似乎不是最理想的,并且还会涉及另一个套接字。
对于我可能采取的任何其他实施方式,有什么想法或建议吗?任何信息,将不胜感激。我正在使用 Python,但任何语言都可以。
【问题讨论】:
-
阅读 ZMQ 指南,特别是 chapter 4 on reliable request/reply patterns,看看这些设计是否适合您的用例。对于您提到的规格,我几乎肯定会使用 ROUTER/DEALER,特别是它是您提到的唯一一种不打算单向的套接字类型。不要害怕复杂性,学习曲线不是那么陡峭,并且不要害怕额外的套接字如果你需要它们(你可能不需要)。
-
... 此外,如果您在链接的章节中找到一个 close 但以某些方式倒下的示例,那么有人可以更轻松地为您指明正确的方向解决这些缺点。