开发者学堂课程【大数据 ZooKeeper 快速入门: ZooKeeper 典型应用:数据发布与订阅】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/549/detail/7574
ZooKeeper 典型应用:数据发布与订阅
发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到 ZK 节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。
应用在启动的时候会主动来获取一次配置,同时,在节点上注册一个 Watcher,这样一来,以后每次配置有更新的时候,都会实时通知到订阅的客户端,从来达到获取最新配置信息的目的。比如:
分布式搜索服务中,索引的元信息和服务器集群机器的节点状态存放在 ZK 的一些指定节点,供各个客户端订阅使用。
注意:适合数据量很小的场景,这样数据更新可能会比较快。
比如现在有一个分布式应用电商网站,电商网站中有比较多的模块:订单、购物车、秒杀等等,这些模块在启动运行的时候都需要数据库的支持。传统方式是把数据库相关信息配置在某个模块中,比如订单模块,把它的数据库信息配置在文件当中,然后订单模块启动时就加载这些配置文件。
如果想要同一去管理这些配置文件就要利用到 ZooKeeper 特性,比如有一个 ZooKeeper 集群,要进行数据的发布与订阅首先需要将数据统一发送到 ZooKeeper 集群上。
注意:统一管理的数据不能太大。
因为 ZooKeeper 要求它不能保存过大的文件数据一般都在kb级别,因此可以把数据库相关信息保存,比如在 ZooKeeper 集群中创建一个路径:/emall/dbdata ,在这节点中存放一些数据,比如 db.地址、密码等信息,这样在节点中就有了相关信息。
所有应用第一次启动时要在 /emall/dbdata 上获取这个信息,如果不获取的话就不能启动,因此需要做一个相关注释:
第一步,所有订阅者初次启动的时候去zk指定的节点获取相关的订阅信息( 数据库相关信息)。这样获取了一次,获取方式就是在每个模块当中引入ZooKeeper代码就可以,可以通过 zk.getData(“/emall/dbdata”)这样每个模块都引入 ZooKeeper 的 API 进行操作,这样就可以获取数据。
获取数据的同时为了能够保证数据发生改变能够动态获取到还要设置监听,监听节点数据的变化。为了实现动态维护一定要设置监听,这时代码形式为:zk.getData(“/emall/dbdata,true”)
设置完监听后,后续统一管理人员需要把数据库做一个升级,比如密码修改等等,这时一旦节点数据发生改变,监听就会被触发,各个应用(订阅者,相对于 ZooKeeper 来说就是客户端)就会收到事件的通知,从而获取新的配置信息,这样就完成了动态获取数据的功能,如下:
为了保证后续再次获取到数据发生改变还要再次设置相同的监听,这样就可以保证监听一直有效,一旦数据发生改变,订阅者就会得到通知,获取之后再次监听,下一次改变还可以获取到,这样就完成了全局的数据发布与订阅,这时管理人员即可在 ZooKeeper 针对节点数据进行修改即可,下方各个应用都可以针对这个数据,即可以感受到这种变化,又可以针对这个变化进行修改,这就是数据发布与订阅。