分布式处理中,总会存在多个服务节点同时工作,并且节点数量会随着网络规模的变化而动态增减,服务节点也有可能发生宕机与恢复。面对着动态增减的服务节点,我们如何保证客户请求被服务器正确处理呢。我们可以通过zookeeper临时节点创建与自动删除来掌握服务节点的动态增减。
ignite分布式缓存支持使用zookeeper发现ignite节点的增减,这正是zookeeper管理服务节点的一个典型应用场景。我们来看看关键代码
1 | // 关键方法,创建包含自增长id名称的目录,这个方法支持了分布式锁的实现 |
采用CreateMode.EPHEMERAL_SEQUENTIAL模式创建临时节点,可以支持服务节点的实时管理。没错,这个模式和《Zookeeper使用实例——分布式共享锁》中创建有序节点支持分布式共享锁是一致的。EPHEMERAL_SEQUENTIAL表示创建有序的临时目录节点,zookeeper客户端创建临时节点后,只要session断开,该临时节点会自动删除。
所以,服务器在zookeeper上创建一个临时目录节点,通过节点事件监听我们可以知道服务器已经加入到服务网络中,监听到临时目录节点删除事件,我们可以知道该节点对应的服务器已经脱离服务网络。下面我们看看具体代码
服务器启动后在zookeeper创建临时目录
1 | package com.coshaho.learn.zookeeper; |
节点管理服务监听zookeeper临时目录节点创建删除事件
1 | package com.coshaho.learn.zookeeper; |
启动两个服务器
1 | package com.coshaho.learn.zookeeper; |
运行结果
1 | log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper). |