使用场景 

      当一个对象的改变,需要通知其他对象而且不知道要通知多少个对象,可以使用发布订阅模式 。在分布式中的应用有配置管理(Configuration Management) 、集群管理(Group Membership)/服务发现。

        配置管理
        如果集群中的机器的程序配置都是一样的,而且需要动态修改,我们可以使用发布和订阅模式,把配置做统一的管理。
        故名思议就是一方把数据发布出来,另一方通过某种手段可以得到这些数据。通常数据订阅有两种方式:推模式和拉模式。
        推模式一般是服务器n主动向客户端推送信息,拉模式是客户端主动去服务器获取数据(通常是采用定时轮询的方式)。
        zk采用两种方式相结合,发布者将数据发布到zk集群节点上,订阅者通过一定的方法告诉服务器,我对哪个节点的数据感兴趣,那服务器在这些节点的数据发生变化时,就通知客户端,客户端得到通知后可以去服务器获取信息。

        集群管理(Group Membership)/服务发现
        集群管理,在分布式系统中,我们常常需要知道某个机器是否可用,传统开发中,可以通过ping某个机器来实现,ping得通说明对方是可用的,相反是不可用的。zk中我们所有的机器都注册一个临时节点,我们判断一个机器是否可用只需要判断这个节点在zk中是否存在就可以了,不需要直接去连接需要检查的机器,降低系统的复杂度。
        服务发现,对集群中的服务上下线做统一的管理,每个工作服务器都可以作为数据的发布方,向集群注册自己的基本信息。而让某些监控服务器作为订阅方,订阅工作服务器的基本信息,当工作服务器的信息发生改变时,如服务上下线、服务器的角色等发生变更时,监控服务器可以得到通知,并响应这些变化。
       

原理解析

        架构图
        

配置管理

        config 节点用于配置管理
        Manage Server 发布消息
        Work Server 订阅消息

        Control Server 通过command节点写入命令信息,Manage Server订阅command节点的数据改变,来接收控制指令。

服务发现

        Server 用于服务器发现, Worker 启动的时候,在Server创建一个临时节点,Manage Server 通过监控Server节点的子节点的列表的改变,来更新内存中工作服务器列表的信息。
       

程序流程

        Manage Server 程序 工作流程
        

        Work Server程序主体流程
        


        类图
        
        SubscrbeZkClient 负责驱动WordServer和ManageServer        
        ServerConfig 记录WorkServer的配置信息
        ServerData 记录WordServer的基本信息
        

测试

服务发现
运行:SubscrbeZkClient.main()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
start manage server.
start work server.
work server regist to /server.
work server regist to /server.
manage server : work server list changed, new list is 
[192.168.1.0]
 
start work server.
work server regist to /server.
manage server : work server list changed, new list is 
[192.168.1.1, 192.168.1.0]
 
start work server.
work server regist to /server.
manage server : work server list changed, new list is 
[192.168.1.1, 192.168.1.0, 192.168.1.2]
 
start work server.
work server regist to /server.
manage server : work server list changed, new list is 
[192.168.1.1, 192.168.1.0, 192.168.1.3, 192.168.1.2]
 
start work server.
work server regist to /server.
manage server : work server list changed, new list is 
[192.168.1.1, 192.168.1.0, 192.168.1.3, 192.168.1.2, 192.168.1.4]
 
敲回车键退出!

配置管理
在zkCli.sh 输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[zk: localhost:2181(CONNECTED) 45] create /commands list
Created /commands
[zk: localhost:2181(CONNECTED) 46] set /commands create 
cZxid = 0x57ed
ctime = Wed Aug 24 11:44:21 CST 2016
mZxid = 0x57ee
mtime = Wed Aug 24 11:44:28 CST 2016
pZxid = 0x57ed
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
[zk: localhost:2181(CONNECTED) 47] set /commands modify 
cZxid = 0x57ed
ctime = Wed Aug 24 11:44:21 CST 2016
mZxid = 0x57f0
mtime = Wed Aug 24 11:44:34 CST 2016
pZxid = 0x57ed
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
控制台对应输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
manage server : cmd = list
[192.168.1.1, 192.168.1.0, 192.168.1.3, 192.168.1.2, 192.168.1.4]
 
manage server : cmd = create
Work server : new Work server config is = ServerConfig [dbUrl=jdbc:mysql://localhost:3306/mydb, dbPwd=123456, dbUser=root]
Work server : new Work server config is = ServerConfig [dbUrl=jdbc:mysql://localhost:3306/mydb, dbPwd=123456, dbUser=root]
Work server : new Work server config is = ServerConfig [dbUrl=jdbc:mysql://localhost:3306/mydb, dbPwd=123456, dbUser=root]
Work server : new Work server config is = ServerConfig [dbUrl=jdbc:mysql://localhost:3306/mydb, dbPwd=123456, dbUser=root]
Work server : new Work server config is = ServerConfig [dbUrl=jdbc:mysql://localhost:3306/mydb, dbPwd=123456, dbUser=root]
manage server : cmd = modify
Work server : new Work server config is = ServerConfig [dbUrl=jdbc:mysql://localhost:3306/mydb, dbPwd=123456, dbUser=root_modify]
Work server : new Work server config is = ServerConfig [dbUrl=jdbc:mysql://localhost:3306/mydb, dbPwd=123456, dbUser=root_modify]
Work server : new Work server config is = ServerConfig [dbUrl=jdbc:mysql://localhost:3306/mydb, dbPwd=123456, dbUser=root_modify]
Work server : new Work server config is = ServerConfig [dbUrl=jdbc:mysql://localhost:3306/mydb, dbPwd=123456, dbUser=root_modify]
Work server : new Work server config is = ServerConfig [dbUrl=jdbc:mysql://localhost:3306/mydb, dbPwd=123456, dbUser=root_modify]


Zookeeper实现数据的发布和订阅的更多相关文章

  1. (原)3.2 Zookeeper应用 - 数据的发布与订阅

    本文为原创文章,转载请注明出处,谢谢 数据的发布与订阅 1.应用 服务端监听数据改变,客户端创建/更新节点数据,客户端提供数据,服务端处理 2.原理 客户端监控节点数据改变事件(例如配置信息,下图的c ...

  2. Meteor 之 数据的发布于订阅(Publish and subscribe )

    发布和订阅 发布(Publication)和订阅(Subscription)是 Meteor 的最基本最重要的概念之一,但是如果你是刚刚开始接触 Meteor 的话,也是有些难度的. 这已经导致不少误 ...

  3. 【cartographer_ros】五: 发布和订阅陀螺仪Imu信息

    上一节介绍了里程计Odometry传感数据的订阅和发布. 本节会介绍陀螺仪Imu数据的发布和订阅.陀螺仪在cartographer中主要用于前端位置预估和后端优化. 目录 1:sensor_msgs/ ...

  4. 【cartographer_ros】四: 发布和订阅里程计odom信息

    上一节介绍了激光雷达Scan传感数据的订阅和发布. 本节会介绍里程计Odom数据的发布和订阅.里程计在cartographer中主要用于前端位置预估和后端优化. 官方文档: http://wiki.r ...

  5. 【cartogarpher_ros】三: 发布和订阅雷达scan信息

    上一节介绍和测试了cartographer的官方demo. 本节会编写ros系统中,最常用的激光雷达LaserScan传感数据的订阅和发布,方便在cartographer中加入自己的数据进行建图与定位 ...

  6. 【cartographer_ros】六: 发布和订阅路标landmark信息

    上一节介绍了陀螺仪Imu传感数据的订阅和发布. 本节会介绍路标Landmark数据的发布和订阅.Landmark在cartographer中作为定位的修正补充,避免定位丢失. 这里着重解释一下Land ...

  7. ZooKeeper 典型应用场景-数据发布与订阅

    ZooKeeper 是一个高可用的分布式数据管理与系统协调框架.基于对 Paxos 算法的实现,使该框架保证了分布式环境中数据的强一致性,也正是基于这样的特性,使得 ZooKeeper 可以解决很多分 ...

  8. Zookeeper学习(八):Zookeeper的数据发布与订阅模式

     http://blog.csdn.net/ZuoAnYinXiang/article/category/6104448 1.发布订阅的基本概念        1.发布订阅模式可以看成一对多的关系:多 ...

  9. Zookeeper应用之一:数据发布与订阅初体验

    Zookeeper到底是什么?可以从Zookeeper提供的功能来理解.本篇小作文就是使用其提供的功能之一:数据发布与订阅. 需求:服务端开启多个实例提供服务,客户端使用服务.如果服务端某个服务下线或 ...

随机推荐

  1. 搭建一个交互式的前端构建环境.md

    为了提高开发效率.减少重复的操作,现在几乎全部的前端项目都需要依赖一些构建工具来实现自动化打包,主流的有webpack, gulp, grunt等.加上各种各样的配置文件就会形成了一个相对复杂的构建环 ...

  2. python学习之路网络编程篇(第五篇)-续篇

    Python堡垒机实现之基础知识 一般的堡垒机必须要具备以下5个基本功能: 1.权限控制 2.执行命令 3.上传下载文件 4.远程登录 5.记录操作 权限控制 说明:根据不同的登录用户分配不同的可管理 ...

  3. asp.net使用session完成: 从哪个页面进入登录页面,登录成功还回到那个页面

    1.在Login.aspx页面Load中加入 if (!IsPostBack && Request.UrlReferrer != null) {      Session[ " ...

  4. iOS开发基础:最新的APP打包上架流程

    之前有人留言让我更新部分文章,下面就为大家分享一下iOS的APP打包上架流程: 上传至apple developer 1.1 上传准备工作 更新上架和发布上架不同,在原始版本首次上架的时候就将描述文件 ...

  5. APP自动化框架LazyAndroid使用手册(3)--核心API介绍

    作者:黄书力 概述 在前一篇博文中,简要介绍了一款安卓UI自动化测试框架LazyAndroid (http://blog.csdn.net/kaka1121/article/details/53204 ...

  6. git > 2.3 实现同步盘的功能

    话不多说,简单粗暴 http://stackoverflow.com/questions/35643201/how-to-set-up-a-sychronous-directory-in-remote ...

  7. hive表的存储格式; ORC格式的使用

    hive表的源文件存储格式有几类: 1.TEXTFILE 默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到hdfs上不进行处理.源文件可以直接通过hadoop fs -cat 查 ...

  8. Android开发学习之路--基于vitamio的视频播放器(二)

      终于把该忙的事情都忙得差不多了,接下来又可以开始good good study,day day up了.在Android开发学习之路–基于vitamio的视频播放器(一)中,主要讲了播放器的界面的 ...

  9. popupwindow中EditText获取焦点后自动弹出软键盘

    关于popupwindow中EditText获取焦点后自动弹出软键盘的问题,玩过手机qq或空间的童鞋应该知道,再点击评论时会弹出一个编辑框,并且伴随软键盘一起弹出是不是很方便啊,下面我们就来讲一下实现 ...

  10. 使用Android Studio向GitHub提交代码

    使用Android Studio向GitHub提交代码 在GitHub上创建一个仓库 填写仓库名称.描述.类型(公有.私有)等信息,点击创建 到此,成功创建了我们的仓库,并且初始化创建了README. ...