zookeeper典型应用场景之五:数据发布与订阅

数据发布与订阅

     发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。例如全局的配置信息,服务式服务框架的服务地址列表等就非常适合使用。

     一般的类似于发布/订阅的模式有推和拉的两种方式,分别是推Push模式和Pull模式,推模式:就是服务器主动将数据更新发送给所有订阅的客户端;而拉模式:服务端只是发送一个消息给订阅的客户端,客户端根据自己的情况,是否来获取最新的数据信息,通常采用定时轮询的方式进行拉取。

     而在zookeeper中,是把这两种方式进行结合了。客户端详服务端注册自己需要关注的节点,一旦该节点的数据发生变更,那么服务端就会向相应的客户端发送watcher事件的通知,客户端接受到这个消息通知后,需要主动的到服务端获取最新的数据。如果将配置信息存放在Zookeeper上进行集中管理,那么通常情况下,在应用启动的时候主动到Zookeeper服务端进行进行一次配置信息的获取,同时在指定的节点上注册一个Wather事件通知,这样节点信息发生变更,服务端都会实时的通知到所有订阅的客户端,从而实现获取最新配置信息的目的。

案例模拟

 下面通过一个案例来模拟一下zookeeper的这个场景的使用。

   在平常的开发中,会遇到这样的需求,系统中需要使用一些通用的配置信息,例如机器的列表信息,运行时开发配置,数据配置信息等。这些全局配置信息通常具备下面这些特性

     1.数据量比较小

     2.数据内容在运行时会发生变化

     3.集群中各个机器共享,配置一致

对于上面中的这些配置,我们一般采取的操作是存取到本地或者内存中,无论采取哪种配置都可以实现相应的操作。使用本地配置的方式,通常系统就是在应用启动的时候读取本地配置文件properties,来进行初始化,并且在运行的过程中定期去check本地文件的内容变更。或者可以通过数据库的方式进行配置,定期的去数据库检查更新。但是一旦遇到集群规模比较大的情况的话,两种方式就不再可取。而我们还需要能够快速的做到全部配置信息的变更,同时希望变更成本足够小,因此我们需要一种更为分布式的解决方案。

 

现实中实现的分布式方案有很多:

  1. 通过Redis或者Memcache来存储配置文件,通过集中式缓存系统来维护配置文件。

  2. 或者LowB点的就是通过数据库来维护,客户端通过内存来存放配置,每次配置更新时候,发出远程消息来通知各个客户端更新本地缓存。

  3. 通过ZookeeperWather事件机制,通知订阅的客户端。本次就是通过这种方式来实现。

 

 比如我们把数据库的相关的信息,供全局使用的信息来管理起来,这时候我们就可以在zookeeper上选取一个数据节点来配置存储。例如/viemall/database_properties

基于ZooKeeper的特性,借助ZooKeeper可以实现一个可靠的、简单的、修改配置能够实时生效的配置信息存储方案,整体的设计方案如图:

blob.png

整个配置信息存储方案由三部分组成:ZooKeeper服务器集群、配置管理程序、分布式应用程序。

ZooKeeper服务器集群存储配置信息,在服务器上创建一个保存数据的节点(创建节点操作);配置管理程序提供一个配置管理的UI界面或者命令行方式,用户通过配置界面修改ZooKeeper服务器节点上配置信息(设置节点数据操作);分布式应用连接到ZooKeeper集群上(创建ZooKeeper客户端操作),监听配置信息的变化(使用获取节点数据操作,并注册一个watcher)。

当配置信息发生变化时,分布式应用会更新程序中使用配置信息。

blob.png

 

借助 ZooKeeper我们实现的配置信息存储方案具有的优点如下:

1.   简单。修改配置整个过程变得简单很多。用户只要修改配置,无需进行其他任何操作,配置自动生效。

2.   可靠。ZooKeeper服务集群具有无单点失效的特性,使整个系统更加可靠。即使ZooKeeper 集群中的一台机器失效,也不会影响整体服务,更不会影响分布式应用配置信息的更新。

3.   实时。ZooKeeper的数据更新通知机制,可以在数据发生变化后,立即通知给分布式应用程序,具有很强的变化响应能力。

 

简单的参考源码:

网上开源的分布式配置平台:

http://www.oschina.net/p/disconf?fromerr=hDYKJOtw

其他参考信息地址:

https://yq.aliyun.com/articles/26325

http://blog.csdn.net/zuoanyinxiang/article/details/50937892


发表评论