ZeroMQ:如何实施客户通知?

时间:2019-08-28 13:54:32

标签: networking architecture client-server zeromq

因此,我们通过ZMQ进行了客户端-服务器交互,并且陷入了体系结构争论中,无法找到适合我们需求的适当模式。我希望有智慧和经验的人可以帮助解决它。

这不是必需的,但我需要指出的是,ZMQ并不是直接使用的,它是通过库本身与C ++的Qt绑定,因此低级自定义是可能的,但不受欢迎(它们将大大增加实现工作)。

当前架构

需要一些可靠,方便且健壮的API代理,该代理是通过 REQ <-> REP 实现的:状态,错误代码,加密等。加密是通过单独的授权SSL通道,为API提供了会话密钥,此处提到要强调的是,在ZMQ的套接字级别上尚未提供SSL(看起来过于复杂),存在“会话密钥”(每个客户端对称的加密密钥),它限制了模式解决方案。

因此,存在请求(客户端)+响应(服务器),它可以正常工作。但是我们最近满足了一些针对客户的通知机制的需求。假设当前的代理API提供了某些类型的数据:X,Y,Z(某物的列表)。客户端可以获取其中的任何一个,但是必须在 X,Y或Z发生任何更改时通知它,以便知道要执行新的请求。

问题

很明显,客户端应该接收数据更新或存在此类更新的通知。这可能只是一个 PUB-SUB 问题,但似乎几乎不可能对该解决方案进行加密,或者至少需要授权意识(更不用说真正的“曲折”方式了)。

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

  1. 仍然使用 PUB-SUB ,但仅向订阅者发送通知类型,例如“嘿,有新的X存在”。客户-订户必须使用会话密钥和所有密钥执行已经实施的API请求( REP-REQ )。优点:容易和工作。缺点:客户端逻辑复杂。
  2. 只需重写API即可使用几个 ZMQ_PAIR 套接字。导致客户端-服务器行为类似于普通套接字,但是通知可以从服务器“发回”。优点:方案简单。缺点:重写,并且代理与简单的套接字解​​决方案也没有太大区别。

问题

您会明智地做些什么?是否有任何已解决的解决方案或更好的解决方案?这里可能存在X-Y问题?也许某些东西被认为是解决诸如此类问题的常用方法?

在此先感谢任何聪明的主意。

1 个答案:

答案 0 :(得分:1)

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

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

但是,我希望使用具有单独的PUB / SUB通道的解决方案,因为:

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