c - 用于可靠多播的 zmq 模式

标签 c replication zeromq

我正在努力研究如何使用 zmq 来实现我需要的架构。我有一个经典的发布/订阅情况,除了一旦客户端 x 订阅了一个主题,我需要将主题数据发送给它以便在客户端死机并在重新连接时重新发送时进行缓存。数据顺序很重要,如果客户端暂时离线,我不能错过消息。

PUB/SUB 模式似乎不了解单个客户端,如果它死了,将停止向客户端 x 发送数据。另外,我无法发现这已经发生并缓存消息,也无法知道它何时重新连接。

为了尝试解决这个问题,我使用了 REQ/REP 模式,以便客户端可以宣布自己并有一些持久性,但这并不理想,原因如下:

1) 客户必须不断地询问“我有数据吗?”这冒犯了我的感情

2) 如果没有数据发送给客户端 x 但有数据发送给客户端 y,会发生什么情况?如果没有 zmq,我会为每个客户端分配一个线程,并简单地阻塞没有数据的线程,但我无法在不阻塞客户端 y 的情况下在单个线程中阻塞客户端 x。

我是不是想把一个圆钉子塞进一个方孔里,在这里?有什么方法可以让我从 PUB 那里得到反馈,说“无法发送给客户端 x”?所以我可以缓存消息吗?或者我应该使用其他模式吗?

否则对我来说它又回到了低级别的 tcp...

非常感谢;

杰里米

最佳答案

这是一个活跃的研究领域。

我目前正在做类似的事情。我们的解决方案是建立一个 TCP“反向 channel ”,在该 channel 上接收丢失的数据,并让订阅者知道上次成功接收到的发布是什么,这样当他们重新连接时,他们就可以请求自该发布以来的发布。

关于c - 用于可靠多播的 zmq 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23939160/

相关文章:

android - 如何为Android编译并运行简单的C代码?

c - 没有任何地址规范的字符指针如何保存数据?

mysql - GTID 复制失败错误 1062

cassandra - 如何使用键空间禁用 Cassandra 复制

replication - 热备服务器上的只读查询因获取事务ID而失败

sockets - ZeroMQ 绑定(bind) API zmq_bind() 到 127.0.0.1 :5555 returns error 19

c++ - 在 C# (protobuf-net) 中序列化,在 C++ (protobuf) 中反序列化 : More than 5 fields in class

Azure InputEndpoints 阻止我的 TCP 端口

c - 在子进程中生成随机数

c - C中的指针初始化