zookeeper系列(二):watcher

數(shù)據(jù)變更的通知祝迂。是zookeeper發(fā)布/訂閱的基礎。

概念

  1. client向zkServer發(fā)送請求缺狠,說问慎,我想要監(jiān)聽某個節(jié)點的修改。
  2. zkServer說挤茄,好的如叼。
  3. zk的節(jié)點一旦有變化,zkServer會通知所有訂閱這個節(jié)點的client穷劈,說笼恰,xxx這個節(jié)點有變化。
  4. client收到server的通知后歇终,反查server端這個節(jié)點的信息社证,拿到具體的變化信息。反查函數(shù)其實是watcher的回調函數(shù)评凝,在定義的時候追葡,就定義好了要怎么反查。

以此來做到奕短,針對某一個節(jié)點的監(jiān)聽宜肉。

watcher.png

watcher事件

上面說了,監(jiān)聽某個節(jié)點的變化翎碑,那都有什么變化呢

watcher事件.png
觸發(fā)器.png

只需要關注type不為空的那幾個

  • 節(jié)點創(chuàng)建
  • 節(jié)點刪除
  • 節(jié)點數(shù)據(jù)更新
  • 子節(jié)點列表更新(是子節(jié)點創(chuàng)建或者刪除谬返,子節(jié)點內容變更,不是列表更新)

client注冊watcher的過程

注冊的入口

  1. 在創(chuàng)建client的時候日杈,zkClient中有帶watcher的構造函數(shù)遣铝。
public Zookeeper(String connectStr, int sessionTimeout, Watcher watcher);

當注冊了默認的watcher的時候,client在getData設置watcher的時候达椰,直接用true翰蠢,就用到了默認的wather。

  1. getData啰劲、getChildren梁沧、exist
public byte[] getData(String path, boolean watch, Stat stat); // 就是這里,true蝇裤,就用默認的wather來注冊watcher

public byte[] getData(final String path, Watcher watcher, Stat stat);

別看名字是getData,這幾個方法就是注冊watcher的方法廷支。

注冊的過程

  1. client在調用getData之后,客戶端會將watcher信息栓辜,封裝到request中恋拍,將requst發(fā)送給server。

  2. client等待server的返回藕甩,收到server說注冊成功的返回后施敢,client會將watcher信息保存到watcherManager中。

watcherManager是兩個map。

/**
* key為節(jié)點的路徑僵娃。value為所有監(jiān)聽該節(jié)點的watcher
*/
Map<String, Set<Watcher>> watchTable;

/**
* key為Watcher概作。value為該watcher監(jiān)聽的所有節(jié)點path
*/
Map<Watcher, Set<String>> watch2Paths;
注冊流程.png

watcher觸發(fā)的過程

一旦節(jié)點變動,觸發(fā)了watcher默怨。

  1. 封裝watcherEvent
    首先將通知狀態(tài)(KeeperState)讯榕、事件類型(EventType)以及節(jié)點路徑(Path)封裝成一個WatcherEvent對象。

  2. 查詢watcherManager
    去watcherManager找監(jiān)聽這個節(jié)點的client的watcher匙睹。遍歷愚屁,一個一個通知。然后痕檬,重點來了霎槐,拿到watchet之后,用完就刪除谆棺。也就說栽燕,watcher是一次性的,要持續(xù)監(jiān)聽某個節(jié)點就要持續(xù)注冊watcher改淑。

  3. 調用process方法觸發(fā)watcher
    第2步中碍岔,拿到了所有的watcher,調用watcher中的process方法朵夏。process方法很簡單蔼啦,就是回調client,你監(jiān)聽的這個節(jié)點變動了仰猖。

  4. client收到watcher的process后捏肢。框架層會調用client的process方法饥侵。client自己的process是業(yè)務相關的代碼了鸵赫,得自己實現(xiàn)。比如


    process.png
觸發(fā)流程.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末躏升,一起剝皮案震驚了整個濱河市辩棒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌膨疏,老刑警劉巖一睁,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異佃却,居然都是意外死亡者吁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門饲帅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來复凳,“玉大人瘤泪,你說我怎么就攤上這事∪九鳎” “怎么了均芽?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長单鹿。 經(jīng)常有香客問我,道長深纲,這世上最難降的妖魔是什么仲锄? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮湃鹊,結果婚禮上儒喊,老公的妹妹穿的比我還像新娘。我一直安慰自己币呵,他們只是感情好怀愧,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著余赢,像睡著了一般芯义。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妻柒,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天扛拨,我揣著相機與錄音,去河邊找鬼举塔。 笑死绑警,一個胖子當著我的面吹牛,可吹牛的內容都是我干的央渣。 我是一名探鬼主播计盒,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼芽丹!你這毒婦竟也來了北启?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤志衍,失蹤者是張志新(化名)和其女友劉穎暖庄,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體楼肪,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡培廓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了春叫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肩钠。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡泣港,死狀恐怖,靈堂內的尸體忽然破棺而出价匠,到底是詐尸還是另有隱情当纱,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布踩窖,位于F島的核電站坡氯,受9級特大地震影響,放射性物質發(fā)生泄漏洋腮。R本人自食惡果不足惜箫柳,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望啥供。 院中可真熱鬧悯恍,春花似錦、人聲如沸伙狐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贷屎。三九已至罢防,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間豫尽,已是汗流浹背篙梢。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留美旧,地道東北人渤滞。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像榴嗅,于是被迫代替她去往敵國和親妄呕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348