【问题标题】:Buffering messages for dead subscriber with zeromq使用 zeromq 为死的订阅者缓冲消息
【发布时间】:2015-06-01 11:20:26
【问题描述】:

我在 tcp 中使用 pub-sub 模式。当我的一个订阅者死亡(例如 kill -9)并以相同的身份重新启动时,它不会收到以前的消息。

什么是解决方案,所以当它重新启动时它会收到发送的消息? (我知道 0mq 无法处理)

  1. 运行发布者
  2. 运行 sub0(订阅套接字)
  3. 运行 sub1(订阅套接字)
  4. pkill -9 sub0(模拟守护进程死亡)
  5. 发布者发送消息
  6. 再次运行 sub0(相同的 ZMQ_IDENTITY)

sub0 没有收到丢失的消息。

【问题讨论】:

    标签: zeromq amqp


    【解决方案1】:

    这完全是您的应用程序的责任。看看指南...尤其是Chapter 5 on advanced pub/sub patterns,更具体的是Getting an out of band snapshot

    结果是您的发布服务器实际上有两个套接字,一个用于发布,一个用于其他系统级通信。每当它发布一条新消息时,它也会将该消息添加到本地缓存中......它永远不会忘记它发送的消息。每当您的订阅客户端重新连接到服务器时,它的第二个套接字都会向服务器发送一个请求以获取它错过的所有消息(或者,在链接示例的情况下,数据的整个当前状态),这些消息被发送回到第二个插座对。这样,当订阅者开始通过正常订阅者频道获取新消息时,订阅者就会获得所有消息的最新信息。

    【讨论】:

    • 它将复制套接字的数量并增加不必要的复杂性:( 0mq 对每个对等点都有一个直接套接字 + 有一个不发送消息的缓冲区,
    • 如果没有连接的子套接字,发布套接字将丢弃任何消息。一旦订阅者连接,它就不会排队发送。这是获得所需功能的必要复杂性。我链接到的 ZMQ 指南是由 ZMQ 的创始人之一 Pieter Hintjens 编写的,它与您将获得的关于该主题的官方说法非常接近。
    • 如需详细了解这种情况的发生方式和原因,请read here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多