【问题标题】:Howto find out all the subscribed to filters in a PUB server?如何找出 PUB 服务器中所有订阅的过滤器?
【发布时间】:2016-01-06 14:26:56
【问题描述】:

我有一个 PUB 服务器。它如何知道订阅了哪些过滤器,以便服务器知道它必须创建哪些数据?

一旦没有 SUB 客户端,服务器就不需要创建数据有兴趣。

假设可能的过滤器集很大(或 无限 ),但在任何给定时间订阅者都只是订阅了其中的几个。

示例:假设 SUB 客户仅订阅了纽约和巴黎少数区号的天气源数据。那么 PUB 服务器不应该为世界上每个其他城市的所有其他区号创建天气数据,而只是再次将其丢弃。

您如何找出 PUB 服务器中所有订阅的过滤器?

如果没有简单的方法,我该如何以另一种方式解决这个问题?

【问题讨论】:

  • 你必须创建一个XSUB / XPUB 代理/设备,它也在监听消息。您将收到以0x000x01 开头的消息,也就是说这些消息会告诉您订阅什么以及取消订阅什么。您使用哪种编程语言?另请参阅Espresso example
  • 谢谢。我正在使用 C++。再想一想,我想我会使用第二个 REQ/REP 频道来处理有关订阅和心跳的元数据。这样,如果客户端在没有取消订阅的情况下死亡,服务器就会知道它。
  • 是的,另一个“控制平面”是一种方法。还可以观察到,最初的 PUB/SUB 在 SUB 端进行过滤,这会在您的用例中增加大量流量。

标签: zeromq


【解决方案1】:

我会在这里回答我自己的问题,以防其他人使用。

要求:

  1. 客户端应该能够询问服务器哪些 ID(主题)可供订阅。

  2. 客户端应该选择它感兴趣的id并告诉服务器。

  3. 服务器应该为所有订阅的 id 创建数据并将该数据发送给客户端。

  4. 客户端和服务器不应该在任何一方消失时阻塞/挂起。

实施:

第 1 步。是双向流量,通过 REQ/REP 套接字完成。

第 2 步。是从一台客户端到一台服务器的单向流量,由 PUSH/PULL 套接字完成。

第 3 步。是从一台服务器到多个客户端的单向流量,由 PUB/SUB 套接字完成。

第 4 步。如果服务器或客户端不存在,接收方可以阻止服务器或客户端。因此,我遵循“懒惰的海盗模式”,在尝试接收之前检查队列中是否有任何要接收的内容。 (如果队列中没有任何内容,我将再次检查程序的下一个循环等)。

步骤 4+。客户端可以在没有取消订阅的情况下死亡,服务器不会知道它,它将继续为这些 id 发布数据。一种解决方案是客户端每隔一段时间向服务器重新发送订阅信息(带有时间戳)。这也可以作为客户端订阅的 id 的心跳。如果客户端在没有取消订阅的情况下死亡,服务器会注意到一些订阅 id 有一段时间没有刷新(时间戳)。服务器会删除这些 id。

这个解决方案似乎工作正常。不过,这是很多低级的工作。如果 zeromq 级别更高一些,并且有一些开箱即用的通用且可靠的架构/框架,那就太好了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 2014-03-05
    • 2019-07-28
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    相关资源
    最近更新 更多