【ZooKeeper Notes 11】ZooKeeper客户端地址列表的随机原理
来源:互联网 发布:Java使用redis长连接 编辑:程序博客网 时间:2024/06/07 01:03
转载请用注明:@ni掌柜nileader@gmail.com
在之前一个文章《ZooKeeper Java API 使用样例》中提到,客户端使用ZooKeeper的时候,首先会建立与ZooKeeper的连接,方法是通过调用下面这个构造方法来实现的。
- public ZooKeeper(String connectString, //
- int sessionTimeout, //
- Watcher watcher,//
- boolean canBeReadOnly )
- throws IOException
在这个构造方法中,首先要配置的是ZK服务器的地址列表,即connectString 这个参数,这个参数通常是这样一个格式的字符串:
- 192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181
很明显,我们可以看到,ZK客户端允许我们将ZK服务器的所有地址都配置在这里,于是一个问题就来了,ZK在连接服务器过程中,是如何选择服务器的呢?下面首先来看看ZK客户端是如何处理这个connectString的:
- new ZooKeeper(“192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181”,...)
实例一个ZooKeeper对象的时候,会要求传入一个地址列表的字符串,这个字符串就是ZK服务器的地址列表,用英文状态“,“隔开。
new ConnectStringParser(“192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181”);
- ConnectStringParser connectStringParser =
之后,这个地址列表会被封装到一个ConnectStringParser 对象中去,这个类主要就是解析传入地址列表字符串,将其它保存在一个ArrayList中。这个对象基本结构如下,这里我们主要关注serverAddresses这个成员。
- public final class ConnectStringParser {
- private final String chrootPath;
- private final ArrayList<InetSocketAddress> serverAddresses = new ArrayList<InetSocketAddress>();
- }
接下去,这个地址列表会被进一步封装成StaticHostProvider对象,并且在运行过程中,一直是这个对象来维护整个地址列表。关于这个对象,我们主要关注两点:地址列表的随机和地址获取这两个过程。首先来看地址列表的随机:
- public StaticHostProvider(Collection<InetSocketAddress> serverAddresses)
- throws UnknownHostException {
- ……
- ……
- Collections.shuffle(this.serverAddresses);
- }
这里可以看到,对于传入地址列表,ZK使用java.util.Collections.shuffle(List list) 来对地址列表随机打乱顺序,注意,这个随机过程是一次性的,也就是说,之后使用过程中一直是按照这样的顺序。再来看看地址列表被随机打乱后,又是怎么使用地址的:
- public InetSocketAddress next(long spinDelay) {
- ++currentIndex;
- if (currentIndex == serverAddresses.size()) {
- currentIndex = 0;
- }
- ……
- ……
- return serverAddresses.get(currentIndex);
- }
看一下StaticHostProvider.next(long spinDelay) 方法就明白了。next方法的实现, 没错,就是“Round Robin”。简单的说,ZK客户端将所有Server保存在一个List中,然后随机打乱,并且形成一个环,具体使用的时候,从0号位开始一个一个使用。
另外两个注意点:
1.通过代码,可以发现ZK本质上是通过一个List来维护地址列表的,因此,Server地址能够重复配置,这样能够弥补客户端无法设置Server权重的缺陷,但是也会加大风险。 比如: 192.168.1.1:2181,192.168.1.1:2181,192.168.1.2:2181
2.如果客户端在进行Server切换过程中耗时过长,那么将会收到SESSION_EXPIRED. 这也是上面第1点中的加大风险之处。
本文出自 “ni掌柜的笔记” 博客,请务必保留此出处http://nileader.blog.51cto.com/1381108/932948
- 【ZooKeeper Notes 11】ZooKeeper客户端地址列表的随机原理
- 【ZooKeeper Notes 11】ZooKeeper客户端地址列表的随机原理
- 【ZooKeeper Notes 11】ZooKeeper客户端地址列表的随机原理
- ZooKeeper客户端地址列表的随机原理
- ZooKeeper客户端地址列表的随机原理
- ZooKeeper客户端地址列表的随机原理
- ZooKeeper客户端地址列表的随机原理
- 【ZooKeeper Notes 29】 修复“ZooKeeper客户端打印当前连接的服务器地址为null”的Bug问题描述
- 【ZooKeeper Notes 6】客户端对zookeeper的操作是不可回退的 [OK]
- 【ZooKeeper Notes 6】客户端对ZooKeeper的操作是不可回退的
- 【ZooKeeper Notes 17】ZooKeeper客户端事件串行化处理
- zookeeper 客户端的实现
- zookeeper的python客户端
- Zookeeper的Java客户端
- ZooKeeper 客户端的使用
- zookeeper的java客户端
- Zookeeper客户端的使用
- 【ZooKeeper Notes 4】可视化zookeeper的事务日志
- 程序员面试题精选100题(61)-数对之差的最大值
- 值得学习的品牌突围策略
- 程序高手能帮我吗
- 蛋糕的种类
- ASoC架构中的Codec
- 【ZooKeeper Notes 11】ZooKeeper客户端地址列表的随机原理
- 荤笑话
- JS 关于(function( window, undefined ) {})(window)写法的理解
- 鸽巢原理
- ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your
- Ogre high performance thread support - request for comments
- HOOK专题
- PowerDesigner导出表到word
- ASoC架构中的Platform