我有一个PUB服务器。它如何知道订阅了哪些过滤器,以便服务器知道它必须创建哪些数据?一旦没有客户端感兴趣,
服务器就不需要创建数据。SUB
假设可能的过滤器集很大(或无限),但订阅者在任何给定时间都只订阅其中的几个。
示例:假设SUB客户仅订阅纽约和巴黎的几个区号的天气源数据。那么PUB服务器就不必为世界上每个其他城市的每个其他区号创建天气数据,然后再次将其全部丢弃。
如何找出PUB服务器中所有订阅的过滤器?
如果没有简单的方法,我该如何用其他方法解决这个问题?
我将在这里回答我自己的问题,以防对其他人有用。
要求其中:
客户端应该能够询问服务器哪些 id(主题)可用于订阅。
客户端应该选择它感兴趣的 id 并将其告知服务器。
服务器应该为所有订阅的 ID 创建数据并将该数据发送到客户端。
如果客户端和服务器中的任何一个消失,则客户端和服务器不应阻塞/挂起。
执行:
步骤 1. 是双向流量,通过 REQ/REP 套接字完成。
步骤 2. 是从一个客户端到一台服务器的单向流量,通过 PUSH/PULL 套接字完成。
步骤 3. 是从一台服务器到多个客户端的单向流量,由 PUB/SUB 套接字完成。
步骤 4. 如果服务器或客户端不存在,则接收方可以阻止另一方。因此,我遵循“懒惰海盗模式”,在尝试接收之前检查队列中是否有任何要接收的内容。(如果队列中没有任何内容,我将再次检查程序的下一个循环等)。
步骤 4+。客户端可能会在不取消订阅的情况下死亡,服务器不会知道这一点,它将继续发布这些 id 的数据。一种解决方案是客户端每隔一段时间向服务器重新发送订阅信息(带有时间戳)。这也可以作为客户端订阅的 id 的心跳。如果客户端在没有取消订阅的情况下挂掉,服务器会注意到某些订阅 ID 有一段时间(时间戳)没有刷新。服务器删除这些 ID。
这个解决方案似乎工作得很好。但这是很多低水平的工作。如果 Zeromq 的级别更高一点,并且有一些通用且可靠的架构/框架可以开箱即用,那就太好了。