Zookeeper watcher 事件機制原理剖析
zookeeper 的 watcher 機制,可以分為四個過程:
客戶端註冊 watcher。
服務端處理 watcher。
服務端觸發 watcher 事件。
客戶端回撥 watcher。
其中客戶端註冊 watcher 有三種方式,呼叫客戶端 API 可以分別透過 getData、exists、getChildren 實現,利用前面章節建立的 maven 工程,新建 WatcherDemo 類,以 exists 方法舉例說明其原理。
例項
public class WatcherDemo implements Watcher {
static ZooKeeper zooKeeper;
static {
try {
zooKeeper = new ZooKeeper("192.168.3.39:2181", 4000,new WatcherDemo());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void process(WatchedEvent event) {
System.out.println("eventType:"+event.getType());
if(event.getType()==Event.EventType.NodeDataChanged){
try {
zooKeeper.exists(event.getPath(),true);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
String path="/watcher";
if(zooKeeper.exists(path,false)==null) {
zooKeeper.create("/watcher", "0".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
Thread.sleep(1000);
System.out.println("-----------");
//true表示使用zookeeper例項中配置的watcher
Stat stat=zooKeeper.exists(path,true);
System.in.read();
}
}
執行完程式,控制檯顯示:
此時啟動 zookeeper 命令列終端,檢視並且刪除 watcher 節點:
IDE 控制檯輸出,觸發了節點刪除事件:
客戶端傳送請求給服務端是透過 TCP 長連線建立網路通道,底層預設是透過 java 的 NIO 方式,也可以配置 netty 實現方式。
註冊 watcher 監聽事件流程圖:
1、客戶端傳送事件通知請求
在 Zookeeper 類呼叫 exists 方法時候,把建立事件監聽封裝到 request 物件中,watch 屬性設定為 true,待服務端返回 response 後把監聽事件封裝到客戶端的 ZKWatchManager 類中。
2、服務端處理 watcher 事件的請求
服務端 NIOServerCnxn 類用來處理客戶端傳送過來的請求,最終呼叫到 FinalRequestProcessor,其中有一段原始碼新增客戶端傳送過來的 watcher 事件:
然後進入 statNode 方法,在 DataTree 類方法中新增 watcher 事件,並儲存至 WatchManager 的 watchTable 與 watchTable 中。
3、服務端觸發 watcher 事件流程:
若服務端某個被監聽的節點發生事務請求,服務端處理請求過程中呼叫 FinalRequestProcessor 類 processRequest 方法中的程式碼如下所示:
刪除呼叫鏈最終到 DataTree 類中刪除節點分支的觸發程式碼段:
進入 WatchManager 類的 triggerWatch 方法:
繼續跟蹤進入 NIOServerCnxn,構建了一個 xid 為 -1,zxid 為 -1 的 ReplyHeader 物件,然後再呼叫 sendResonpe 方法。
4、客戶端回撥 watcher 事件
客戶端 SendThread 類 readResponse 方法接收服務端觸發的事件通知,進入 xid 為 -1 流程,處理 Event 事件。
作者公眾號:一起寫程式
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2310/viewspace-2797753/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ZooKeeper Watcher機制
- Zookeeper watch機制原理
- Apache ZooKeeper - 事件監聽機制初探Apache事件
- 深入剖析WebRTC事件機制之SigslotWeb事件
- Android RollBack機制實現原理剖析Android
- Android10_原理機制系列_事件傳遞機制Android事件
- 深入理解React:事件機制原理React事件
- 【Java面試】Zookeeper中的Watch機制的原理?Java面試
- Spring 事件監聽機制及原理分析Spring事件
- javascript事件機制底層實現原理JavaScript事件
- 深入剖析Vue原始碼 - 揭祕Vue的事件機制Vue原始碼事件
- Android從原始碼角度剖析View事件分發機制Android原始碼View事件
- 深入剖析OkHttp系列(五) 來自官方的事件機制HTTP事件
- jQuery原始碼剖析(五) - 事件繫結原理剖析jQuery原始碼事件
- Zookeeper--Watch機制
- js內部事件機制–單執行緒原理JS事件執行緒
- 淺談JS事件機制與React事件機制JS事件React
- 深度剖析Spring Boot自動裝配機制實現原理Spring Boot
- Netty原始碼解析 -- 事件迴圈機制實現原理Netty原始碼事件
- DOM事件機制事件
- redis事件機制Redis事件
- react事件機制React事件
- 剖析垃圾回收機制(上)
- Elasticsearch使用syslog傳送Watcher告警事件Elasticsearch事件
- Redis的事件機制Redis事件
- View事件機制分析View事件
- JS的事件物件與事件機制JS事件物件
- JavaScript執行緒機制與事件機制JavaScript執行緒事件
- 搞懂ZooKeeper的Watcher之原始碼分析及特性總結原始碼
- iOS 中的事件傳遞和響應機制 - 原理篇iOS事件
- Mysql鎖機制與最佳化實踐以及MVCC底層原理剖析MySqlMVC
- 深入剖析Linux IO原理和幾種零拷貝機制的實現Linux
- Spring事件機制詳解Spring事件
- Redis 事件機制詳解Redis事件
- JavaScript事件迴圈機制JavaScript事件
- Android事件分發機制Android事件
- JS 事件機制 Event LoopJS事件OOP
- Qt 事件機制 學習QT事件