ZeroMQ:如何实现客户端通知?

Posted

技术标签:

【中文标题】ZeroMQ:如何实现客户端通知?【英文标题】:ZeroMQ: how to implement client notifications? 【发布时间】:2019-08-28 13:54:32 【问题描述】:

因此,我们已经通过 ZMQ 进行了客户端-服务器交互,并陷入了争论适合我们需求的正确模式的架构中。我希望有智慧和经验的人可以帮助解决它。

这不是必需的,但我需要提一下,ZMQ 并没有被直接使用,而是 Qt 与 C++ 库本身的绑定,因此低级自定义是可能的,但不可取(它们会显着增加实施工作)。

当前架构

需要一些可靠、方便且健壮的 API 代理,该代理已通过 REQ REP 实现:状态、错误代码、加密等。加密通过以下方式实现单独的授权 SSL 通道,为 API 提供会话密钥,这里提到是为了强调 ZMQ 的套接字级别没有提供 SSL(看起来太复杂),存在“会话密钥”(每个客户端的对称加密密钥),它限制以某种方式解决模式。

所以,存在请求(客户端)+响应(服务器),它可以工作。但我们最近遇到了为客户提供一些通知机制的需求。假设当前的代理 API 提供了一些类型的数据:X、Y、Z(某物的列表)。客户端可以获取其中任何一个,但必须通知 X 或 Y 或 Z 发生任何变化,以便知道要完成新请求。

问题

显然,客户端应该收到数据更新或存在此类更新的通知。这可能只是一个 PUB-SUB 问题,但似乎几乎不可能将此解决方案加密,或者至少是授权感知的(更不用说真正“棘手”的方法了)。

经过一些讨论,出现了两种意见,描述了两种不同的解决方法:

    仍然使用 PUB-SUB,但只向订阅者发送通知类型,例如“嘿,有新的 X 出现”。客户-订阅者必须使用会话密钥等执行已经实现的 API 请求(REP-REQ)。优点:简单好用。缺点:客户端逻辑复杂。 只需重写 API 以使用一对 ZMQ_PAIR 套接字。导致客户端-服务器行为类似于普通套接字,但通知可以从服务器“发回”。优点:方案简单。缺点:重写,broker也不会和简单的socket方案有太大区别。

问题

你会怎么做?也许有任何描述的解决方案或更好的解决方案?这里可能存在 X-Y 问题?也许某些东西被认为是解决此类问题的常用方法?

提前感谢您提出的任何好主意。

【问题讨论】:

【参考方案1】:

ZMQ_PAIR 套接字主要用于线程之间的通信,所以如果可能的话,我认为它们不是客户端/服务器设置的好解决方案。

您可以使用 ROUTER/DEALER 而不是 REQ/REP,因为它们允许使用其他模式,而不仅仅是请求/回复。我认为较新版本的 ZeroMQ 提供了 SERVER/CLIENT 作为更好的选择,但我自己没有使用它们。

但是,我更喜欢具有单独 PUB/SUB 频道的解决方案,因为:

您不必更改现有的 REQ/REP 协议。 它只允许对通知感兴趣的客户端连接到 PUB 套接字并处理通知。其他客户端只能使用现有的 REQ/REP 协议。 PUB/SUB 可以自动向多个客户端发送通知。 PUB/SUB 只允许订阅特定通知。

【讨论】:

以上是关于ZeroMQ:如何实现客户端通知?的主要内容,如果未能解决你的问题,请参考以下文章

使用 ZeroMQ 实现消息总线

C# - 关于服务器向客户端发送推送通知的设计问题 - 如何实现?

redis如何实现订单失效通知

如何实现消息推送功能

zeromq:如何防止无限等待?

如何在 C++ 中使用 ZeroMQ 通信多个图像?