如何将所有数据推送给后期订阅者?

时间:2013-05-03 18:32:15

标签: zeromq

我想知道zmq是否已经解决了以下问题(或)zmq顶部的应用程序需要处理它。

1)向所有订阅者发布数据的中央发布者。这些数据本质上是静态的,类似于配置。可以在任何时间修改数据 2)多个订阅者订阅来自此发布者的消息。出版商可以随时加入 3)如果数据发生变化,发布者应该只将差异发布给现有订阅者 4)如果订户稍后加入,则发布者应将所有数据(当前配置)发布给新订户。

Zeromq指南建议以下解决慢性乔尼综合征,但这并不能解决上述问题。 http://zguide.zeromq.org/page:all#Slow-Subscriber-Detection-Suicidal-Snail-Pattern

2 个答案:

答案 0 :(得分:3)

指南中的克隆模式正是您想要的。

答案 1 :(得分:2)

我在设置中遇到的问题是它要求所有订阅者具有相同的状态。如果所有订户都是版本7并且您发布了7到8差异,那么它们都会更新到版本8.但是这需要节点之间紧密耦合的状态同步。当订阅者不同步时,您将如何处理这种情况?

考虑这种替代设置:

  • “publisher”有一个绑定的ROUTER套接字
  • 每个“订户”都有一个连接到ROUTER的DEALER套接字
    • 无法使用REQ套接字,因为这会禁止发送“更新提示”(详情如下)
  • 当订阅者i加入网络时,它会向发布者发送“更新”请求,以便发布者知道订阅者的身份及其当前版本version[i]
    • 发布商回应必要的差异,以使订阅者i保持最新状态
  • 如果发布者(即新版本)上的数据发生变化,它会向所有已知订阅者发送“更新提示”
    • 当订阅者收到“更新提示”时,它会执行“更新”请求
  • (可选)订阅者定期发送“更新”请求(不频繁轮询)

这种方法有以下好处:

  • 出版商是服务员;订户是客户
  • 发布者永远不会发送任何实际数据 - 它只响应来自客户端的请求(即“更新提示”不算作发送实际数据)
  • 即使订阅者间歇性地不同步,订阅者也会独立保持最新状态(最终的一致性)