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

ZeroMQ: how to implement client notifications?

因此,我们通过 ZMQ 进行了客户端-服务器交互,并陷入了关于适合我们需求的适当模式的架构争论。希望有经验的高手帮忙解决一下。

这不是必需的,但我需要指出的是 ZMQ 没有被直接使用,而是 Qt 与 C++ 在库本身上的绑定,因此低级定制是可能的但不受欢迎(它们会显着增加实施工作量).

当前架构

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

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

问题

显然,客户端应该收到数据更新或此类更新存在的通知。这可能只是一个 PUB-SUB 问题,但似乎几乎不可能使这个解决方案加密,或者至少是授权感知(没有提到真正的 "crutchy" 方法来做到这一点).

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

  1. 仍然使用PUB-SUB,但只向订阅者发送通知类型,如"hey, there's new X present"。客户端-订阅者必须执行已经实现的 API 请求 (REP-REQ) 以及会话密钥和所有。优点:简单易行。缺点:客户端逻辑复杂
  2. 只需重写 API 即可使用一对 ZMQ_PAIR 套接字。导致客户端-服务器行为类似于普通套接字,但通知可以来自服务器 "sent back"。优点:方案简单。缺点:重写,代理与简单的套接字解​​决方案没有太大区别。

问题

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

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

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

您可以使用 ROUTER/DEALER 而不是 REQ/REP,因为它们允许除 request/reply 之外的其他模式。我认为较新版本的 ZeroMQ 提供 SERVER/CLIENT 作为更好的选择,但我自己没有使用过它们。

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

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