zookeeper的watch機制原理解析
一、Watch機制介紹
我們可以把 Watch 理解成是注冊在特定 Znode 上的觸發(fā)器。當這個 Znode 發(fā)?改變,也就是調(diào)?了 create , delete , setData ?法的時候,將會觸發(fā) Znode 上注冊的對應事件,請求 Watch 的客戶端會接收到異步通知。
具體交互過程如下:
- 客戶端調(diào)? getData ?法的時候, watch 參數(shù)設置為 true 。服務端接到請求,返回節(jié)點數(shù)據(jù),并 且在對應的哈希表?插?被 Watch的 Znode 路徑。
- 當被 Watch 的 Znode 已刪除,服務端會查找哈希表,找到該 Znode 對應的所有
Watcher,異步通知客戶端,并且刪除哈希表中對應的 Key-Value。
這里的服務端指的是zk的服務端。

客戶端使?了NIO通信模式監(jiān)聽服務端的調(diào)?。
二、zkCli客戶端使?watch
zkCli客戶端常用命令詳解:
http://www.dhdzp.com/article/252869.htm
create /test:創(chuàng)建test節(jié)點set /test aaa:給test節(jié)點賦值aaa數(shù)據(jù)get -w /test:?次性監(jiān)聽節(jié)點,注意這里是監(jiān)聽的數(shù)據(jù)變化,假如test子節(jié)點的數(shù)據(jù)發(fā)生變化也是收不到監(jiān)聽消息的(假如在監(jiān)聽節(jié)點下創(chuàng)建和刪除子節(jié)點這些都是監(jiān)聽不到的,但是刪除監(jiān)聽的節(jié)點是可以監(jiān)聽到的)ls -w /test:監(jiān)聽?錄,創(chuàng)建和刪除?節(jié)點會收到通知。?節(jié)點中新增節(jié)點不會收到通知ls -R -w /test:對于?節(jié)點中?節(jié)點的變化,但內(nèi)容的變化不會收到通知
2.1、get -w命令詳解
創(chuàng)建一個節(jié)點后,然后通過 get -w /test監(jiān)聽節(jié)點,然后使用另外一個客戶端對該節(jié)點進行了賦值,這時候可以看到收到的監(jiān)聽消息。

監(jiān)聽到后并不是監(jiān)聽到修改后新的值,而是類似于一個消息,意思是告訴他節(jié)點發(fā)生變化了。這時候可以通過get /test命令來獲取節(jié)點被修改后的值。

再次使用另一個客戶端set了一下值,并沒有監(jiān)聽到消息,因為 get -w /test是?次性監(jiān)聽節(jié)點。

假如想一直監(jiān)聽的話,可以在收到監(jiān)聽消息后,立馬再執(zhí)行 get -w /test命令。

刪除節(jié)點是可以監(jiān)聽到的,監(jiān)聽到的消息事件類型和數(shù)據(jù)修改是不一樣的。

2.2、ls -w命令詳解
ls -w監(jiān)聽當前節(jié)點的創(chuàng)建和刪除

又使用命令開啟了監(jiān)聽,然后在剛剛創(chuàng)建的sub1節(jié)點下又創(chuàng)建了一個子節(jié)點,這時候收不到監(jiān)聽的。

2.3、ls -R -w命令詳解

三、curator客戶端使?watch
springboot整合curator客戶端:http://www.dhdzp.com/article/252816.htm
我直接是基于上一篇文章當中的項目進行watch練習!
@Test
/**
* 監(jiān)聽test節(jié)點
*
* @throws Exception
*/
@Test
public void addNodeListener() throws Exception {
NodeCache nodeCache = new NodeCache(curatorFramework, "/test");
nodeCache.getListenable().addListener(new NodeCacheListener() {
@Override
public void nodeChanged() throws Exception {
log.info("{} path nodeChanged: ", "/test");
printNodeData();
}
});
nodeCache.start();
// 阻塞線程
System.in.read();
}
/**
* 獲取test節(jié)點數(shù)據(jù)并打印
*
* @throws Exception
*/
public void printNodeData() throws Exception {
byte[] bytes = curatorFramework.getData().forPath("/test");
log.info("data: {}", new String(bytes));
}


到此這篇關于zookeeper的watch機制原理解析的文章就介紹到這了,更多相關zookeeper watch機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
基于struts2和hibernate實現(xiàn)登錄和注冊功能
這篇文章主要為大家詳細介紹了基于struts2和hibernate實現(xiàn)登錄和注冊功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10
mybatis 如何判斷l(xiāng)ist集合是否包含指定數(shù)據(jù)
這篇文章主要介紹了mybatis 判斷l(xiāng)ist集合是否包含指定數(shù)據(jù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06

