日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

ZooKeeper客户端地址列表的随机原理

發(fā)布時(shí)間:2023/11/27 生活经验 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ZooKeeper客户端地址列表的随机原理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
原創(chuàng)作品,允許轉(zhuǎn)載,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章?原始出處?、作者信息和本聲明。否則將追究法律責(zé)任。http://nileader.blog.51cto.com/1381108/932948

查看PDF版本

轉(zhuǎn)載請(qǐng)用注明:@ni掌柜nileader@gmail.com

?

在之前一個(gè)文章《ZooKeeper Java API 使用樣例》中提到,客戶端使用ZooKeeper的時(shí)候,首先會(huì)建立與ZooKeeper的連接,方法是通過(guò)調(diào)用下面這個(gè)構(gòu)造方法來(lái)實(shí)現(xiàn)的。

  1. public?ZooKeeper(String?connectString,?//?
  2. int?sessionTimeout,?//?
  3. Watcher?watcher,//?
  4. boolean?canBeReadOnly?)?
  5. throws?IOException?

?在這個(gè)構(gòu)造方法中,首先要配置的是ZK服務(wù)器的地址列表,即connectString 這個(gè)參數(shù),這個(gè)參數(shù)通常是這樣一個(gè)格式的字符串:

  1. 192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181?

?很明顯,我們可以看到,ZK客戶端允許我們將ZK服務(wù)器的所有地址都配置在這里,于是一個(gè)問(wèn)題就來(lái)了,ZK在連接服務(wù)器過(guò)程中,是如何選擇服務(wù)器的呢?下面首先來(lái)看看ZK客戶端是如何處理這個(gè)connectString的:

  1. new?ZooKeeper(“192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181”,...)?

?實(shí)例一個(gè)ZooKeeper對(duì)象的時(shí)候,會(huì)要求傳入一個(gè)地址列表的字符串,這個(gè)字符串就是ZK服務(wù)器的地址列表,用英文狀態(tài)“,“隔開(kāi)

  1. ConnectStringParser?connectStringParser?=??
new?ConnectStringParser(“192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181”);?

?之后,這個(gè)地址列表會(huì)被封裝到一個(gè)ConnectStringParser 對(duì)象中去,這個(gè)類主要就是解析傳入地址列表字符串,將其它保存在一個(gè)ArrayList中。這個(gè)對(duì)象基本結(jié)構(gòu)如下,這里我們主要關(guān)注serverAddresses這個(gè)成員

  1. public?final?class?ConnectStringParser?{?
  2. ????private?final?String?chrootPath;?
  3. ????private?final?ArrayList<InetSocketAddress>?serverAddresses?=?new?ArrayList<InetSocketAddress>();?
  4. }?

接下去,這個(gè)地址列表會(huì)被進(jìn)一步封裝成StaticHostProvider對(duì)象,并且在運(yùn)行過(guò)程中,一直是這個(gè)對(duì)象來(lái)維護(hù)整個(gè)地址列表。關(guān)于這個(gè)對(duì)象,我們主要關(guān)注兩點(diǎn):地址列表的隨機(jī)和地址獲取這兩個(gè)過(guò)程。首先來(lái)看地址列表的隨機(jī)

  1. public?StaticHostProvider(Collection<InetSocketAddress>?serverAddresses)?
  2. ????????????throws?UnknownHostException?{?
  3. ????????……?
  4. ……?
  5. ????????Collections.shuffle(this.serverAddresses);?
  6. ????}?

這里可以看到,對(duì)于傳入地址列表,ZK使用java.util.Collections.shuffle(List?list) 來(lái)對(duì)地址列表隨機(jī)打亂順序,注意,這個(gè)隨機(jī)過(guò)程是一次性的,也就是說(shuō),之后使用過(guò)程中一直是按照這樣的順序。再來(lái)看看地址列表被隨機(jī)打亂后,又是怎么使用地址的

  1. ?public?InetSocketAddress?next(long?spinDelay)?{?
  2. ????????++currentIndex;?
  3. ????????if?(currentIndex?==?serverAddresses.size())?{?
  4. ????????????currentIndex?=?0;?
  5. ????????}?
  6. ……?
  7. ……?
  8. ????????return?serverAddresses.get(currentIndex);?
  9. ????}?

看一下StaticHostProvider.next(long spinDelay) 方法就明白了。next方法的實(shí)現(xiàn), 沒(méi)錯(cuò),就是“Round Robin”。簡(jiǎn)單的說(shuō),ZK客戶端將所有Server保存在一個(gè)List中,然后隨機(jī)打亂,并且形成一個(gè)環(huán),具體使用的時(shí)候,從0號(hào)位開(kāi)始一個(gè)一個(gè)使用

另外兩個(gè)注意點(diǎn)

1.通過(guò)代碼,可以發(fā)現(xiàn)ZK本質(zhì)上是通過(guò)一個(gè)List來(lái)維護(hù)地址列表的,因此,Server地址能夠重復(fù)配置,這樣能夠彌補(bǔ)客戶端無(wú)法設(shè)置Server權(quán)重的缺陷,但是也會(huì)加大風(fēng)險(xiǎn)。 比如: 192.168.1.1:2181,192.168.1.1:2181,192.168.1.2:2181

2.如果客戶端在進(jìn)行Server切換過(guò)程中耗時(shí)過(guò)長(zhǎng),那么將會(huì)收到SESSION_EXPIRED. 這也是上面第1點(diǎn)中的加大風(fēng)險(xiǎn)之處

本文出自 “ni掌柜的筆記” 博客,請(qǐng)務(wù)必保留此出處http://nileader.blog.51cto.com/1381108/932948


轉(zhuǎn)載于:https://www.cnblogs.com/java20130722/p/3206755.html

總結(jié)

以上是生活随笔為你收集整理的ZooKeeper客户端地址列表的随机原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。