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