zookeeper的watch機(jī)制原理解析
一、Watch機(jī)制介紹
我們可以把 Watch 理解成是注冊(cè)在特定 Znode 上的觸發(fā)器
。當(dāng)這個(gè) Znode 發(fā)?改變,也就是調(diào)?了 create , delete , setData ?法的時(shí)候,將會(huì)觸發(fā) Znode 上注冊(cè)的對(duì)應(yīng)事件,請(qǐng)求 Watch 的客戶端會(huì)接收到異步通知。
具體交互過程如下:
- 客戶端調(diào)? getData ?法的時(shí)候, watch 參數(shù)設(shè)置為 true 。服務(wù)端接到請(qǐng)求,返回節(jié)點(diǎn)數(shù)據(jù),并 且在對(duì)應(yīng)的哈希表?插?被 Watch的 Znode 路徑。
- 當(dāng)被 Watch 的 Znode 已刪除,服務(wù)端會(huì)查找哈希表,找到該 Znode 對(duì)應(yīng)的所有
Watcher,異步通知客戶端,并且刪除哈希表中對(duì)應(yīng)的 Key-Value。
這里的服務(wù)端指的是zk的服務(wù)端。
客戶端使?了NIO通信模式監(jiān)聽服務(wù)端的調(diào)?。
二、zkCli客戶端使?watch
zkCli客戶端常用命令詳解:
http://chabaoo.cn/article/252869.htm
create /test
:創(chuàng)建test節(jié)點(diǎn)set /test aaa
:給test節(jié)點(diǎn)賦值aaa數(shù)據(jù)get -w /test
:?次性監(jiān)聽節(jié)點(diǎn),注意這里是監(jiān)聽的數(shù)據(jù)變化,假如test子節(jié)點(diǎn)的數(shù)據(jù)發(fā)生變化也是收不到監(jiān)聽消息的(假如在監(jiān)聽節(jié)點(diǎn)下創(chuàng)建和刪除子節(jié)點(diǎn)這些都是監(jiān)聽不到的,但是刪除監(jiān)聽的節(jié)點(diǎn)是可以監(jiān)聽到的)ls -w /test
:監(jiān)聽?錄,創(chuàng)建和刪除?節(jié)點(diǎn)會(huì)收到通知。?節(jié)點(diǎn)中新增節(jié)點(diǎn)不會(huì)收到通知ls -R -w /test
:對(duì)于?節(jié)點(diǎn)中?節(jié)點(diǎn)的變化,但內(nèi)容的變化不會(huì)收到通知
2.1、get -w命令詳解
創(chuàng)建一個(gè)節(jié)點(diǎn)后,然后通過 get -w /test
監(jiān)聽節(jié)點(diǎn),然后使用另外一個(gè)客戶端對(duì)該節(jié)點(diǎn)進(jìn)行了賦值,這時(shí)候可以看到收到的監(jiān)聽消息。
監(jiān)聽到后并不是監(jiān)聽到修改后新的值,而是類似于一個(gè)消息,意思是告訴他節(jié)點(diǎn)發(fā)生變化了。這時(shí)候可以通過get /test
命令來獲取節(jié)點(diǎn)被修改后的值。
再次使用另一個(gè)客戶端set了一下值,并沒有監(jiān)聽到消息,因?yàn)?get -w /test
是?次性監(jiān)聽節(jié)點(diǎn)。
假如想一直監(jiān)聽的話,可以在收到監(jiān)聽消息后,立馬再執(zhí)行 get -w /test
命令。
刪除節(jié)點(diǎn)是可以監(jiān)聽到的,監(jiān)聽到的消息事件類型和數(shù)據(jù)修改是不一樣的。
2.2、ls -w命令詳解
ls -w
監(jiān)聽當(dāng)前節(jié)點(diǎn)的創(chuàng)建和刪除
又使用命令開啟了監(jiān)聽,然后在剛剛創(chuàng)建的sub1節(jié)點(diǎn)下又創(chuàng)建了一個(gè)子節(jié)點(diǎn),這時(shí)候收不到監(jiān)聽的。
2.3、ls -R -w命令詳解
三、curator客戶端使?watch
springboot整合curator客戶端:http://chabaoo.cn/article/252816.htm
我直接是基于上一篇文章當(dāng)中的項(xiàng)目進(jìn)行watch練習(xí)!
@Test /** * 監(jiān)聽test節(jié)點(diǎn) * * @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é)點(diǎn)數(shù)據(jù)并打印 * * @throws Exception */ public void printNodeData() throws Exception { byte[] bytes = curatorFramework.getData().forPath("/test"); log.info("data: {}", new String(bytes)); }
到此這篇關(guān)于zookeeper的watch機(jī)制原理解析的文章就介紹到這了,更多相關(guān)zookeeper watch機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Kafka多節(jié)點(diǎn)分布式集群搭建實(shí)現(xiàn)過程詳解
這篇文章主要介紹了Kafka多節(jié)點(diǎn)分布式集群搭建實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Java實(shí)現(xiàn)圖片轉(zhuǎn)換PDF文件的示例代碼
這篇文章主要介紹了Java實(shí)現(xiàn)圖片轉(zhuǎn)換PDF文件的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Maven打包所有依賴到一個(gè)可執(zhí)行jar中遇到的問題
這篇文章主要給大家介紹了關(guān)于Maven打包所有依賴到一個(gè)可執(zhí)行jar中遇到的問題,將依賴打入jar包,由于maven管理了所有的依賴,所以將項(xiàng)目的代碼和依賴打成一個(gè)包對(duì)它來說是順理成章的功能,需要的朋友可以參考下2023-10-10Java實(shí)現(xiàn)任務(wù)超時(shí)處理方法
任務(wù)超時(shí)處理是比較常見的需求,Java中對(duì)超時(shí)任務(wù)的處理有兩種方式,在文中給大家詳細(xì)介紹,本文重點(diǎn)給大家介紹Java實(shí)現(xiàn)任務(wù)超時(shí)處理方法,需要的朋友可以參考下2019-06-06Java聊天室之實(shí)現(xiàn)聊天室服務(wù)端功能
這篇文章主要為大家詳細(xì)介紹了Java簡(jiǎn)易聊天室之實(shí)現(xiàn)聊天室服務(wù)端功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以了解一下2022-10-10ReentrantReadWriteLock?讀寫鎖分析總結(jié)
這篇文章主要介紹了ReentrantReadWriteLock 讀寫鎖分析總結(jié),ReentranReadWriteLock中有兩把鎖,一把讀鎖,一把寫鎖,關(guān)于這兩把鎖的介紹,需要的小伙伴可以參考一下2022-05-05