Watch機制

来源:https://www.cnblogs.com/paraforjava/archive/2018/02/08/8433264.html
-Advertisement-
Play Games

一、整體流程 1、客戶端註冊Watcher 2、服務端處理Watcher 3、客戶端回調Watcher 二、Watcher 通知狀態與事件類型 state type path WatcheEvent 只有三個屬性 state type path 不會告訴原始數據內容和更新內容,需要client再次主 ...


一、整體流程 1、客戶端註冊Watcher 2、服務端處理Watcher 3、客戶端回調Watcher   二、Watcher 通知狀態與事件類型 state type path WatcheEvent 只有三個屬性 state type path 不會告訴原始數據內容和更新內容,需要client再次主動獲取最新信息  

 

三、客戶端:ZKWatchManager   創建一個Zookeeper實例時,構造方法中傳入一個預設的Watcher,會一直保存在ZKWatchManager的defaultWatcher中,ZKWatchManager實現了ClientWatchManager介面,實現了materialize方法    

 

  四、服務端:WatchManager watchTable和watch2Paths 兩個存儲結構,從兩個維度對Watcher進行存儲   五、具體流程 1、客戶端註冊Watcher getData() 客戶端發起一個getData方法,註冊一個Watcher 1、封裝一個Watcher的註冊信息WatchRegistration,保存數據節點的路徑和Watcher的對應關係 2、將WatchRegistration封裝到Packet中,放入發送隊列中等待客戶端發送(outgoingQueue) 3、客戶端向服務端發送這個請求,同時等待請求的返回,由SendThread線程的readResponse方法負責接收來自服務端的相應,finishPacket方法從Packet中取出Watcher,並註冊到ZKWatchManager中,保存到dataWatches中,是一個Map<String,Set<Watcher>>的數據結構   Packet在網路傳輸中只對requestHeader和request兩個屬性進行序列化,WatchRegistration沒有序列化到底層數組中,不進行網路傳輸   2、服務端處理Watcher getData() setData() 1、服務端收到客戶端的請求後,判斷當前是否需要註冊Watcher(簡單的Boolean類型),需要的話,將當前ServerCnxn對象和數據節點路徑傳入getData方法中 2、ServerCnxn對象和數據節點路徑最終會被存儲在WatchManager的watchTable和watch2Paths中   在setData方法中,對應的數據節點的內容發生變更,調用WatchManager的triggerWatch方法觸發相關事件,封裝WatchedEvent,查詢Watcher後從存儲結構中剔除,調用ServerCnxn的對應方法process方法,將WatchedEvent包裝成WatcherEvent,向客戶端發送通知 sendResponse   藉助當前客戶端連接的ServerCnxn對象來實現對客戶端的WatchedEvent傳遞,真正的Watcher回調與義務邏輯都在客戶端執行   3、客戶端回調Watcher 1、SendThread接受到事件通知,調用readResponse方法,EventThread.queueEvent(watchedEvent)將對象交給eventThread線程來進行處理 2、eventThread.queueEvent方法,根據通知事件類型狀態path,從ZKWatchManager中取出Watcher,同時剔除(materialize方法) 3、取到相關所有的Watcher後,將其放入WaitingEvents這個隊列中,WaitingEvents是一個待處理Watcher的隊列,通過EventThread的run方法對該隊列進行處理,核心processEvent 方法中 watcher.process方法實現watcher方法的調用          
  • Watcher:Watcher是用於監聽節點,session 狀態的,比如getData對數據節點a設置了watcher,那麼當a的數據內容發生改變時,客戶端會收到NodeDataChanged通知,然後進行watcher的回調。
  • AsyncCallback:AsyncCallback是在以非同步方式使用 ZooKeeper API 時,用於處理返回結果的。例如:getData同步調用的版本是:byte[] getData(String path, boolean watch,Stat stat),非同步調用的版本是:void getData(String path,Watcher watcher,AsyncCallback.DataCallback cb,Object ctx),可以看到,前者是直接返回獲取的結果,後者是通過AsyncCallback回調處理結果的。
     


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 互斥鎖: 為什麼要有互斥鎖:由於多線程是並行的,如果某一線程取出了某一個數據將要進行操作,但它還沒有那麼快執行完操作,這時候如果另外一個線程也要操作這個數據,那麼這個數據可能會因為兩次操作而發生錯誤 import time,threading x=6 def run1(): print("run1我... ...
  • 本人錄製的Go入門視頻 "20小時快速入門go語言視頻" :https://pan.baidu.com/s/1jJPsThk 基礎編程 "01、Go語言介紹" "02、環境搭建" "03、第一個Go程式" "04、命名、變數、常量" "05、基礎數據類型" "06、格式化輸出、類型轉換、類型別名" ...
  • 為了方便,這次就不單獨寫腳本了,直接一步一步執行下來就好了先說下游標,就是一個指針,比如我有1234每條占一行,那麼初始游標預設是在1的位置,當read(1)後,游標自動向下next,現在指在2的位置,依次類推,然後是3,4直到最後,除非強制移動游標,否則游標不會再返回的今天寫了一個腳本,具體就是有 ...
  • 1、什麼是C+11 C++11標準為C++編程語言的第三個官方標準,正式名叫ISO/IEC 14882:2011 - Information technology -- Programming languages -- C++。在正式標準發佈前,原名C++0x。它將取代C++標準第二版ISO/IEC ...
  • 2018-02-08 23:32:23 修改context.xml文件 自從學習了servlet後,每次修改裡面的內容後,想要訪問都要重啟伺服器,這樣感覺很麻煩的,所以今天就教大家一個方法,只需要一行代碼就解決“無需重新啟動伺服器”。 請看下麵的圖示: 在第19行代碼處<Context>裡面寫上re ...
  • 使用內置函數 id( xx ) 獲取,返回結果以10進位格式表示 ...
  • hiernate4入門 【實戰】本文將講述hibernate4的入門,我寫是以實用入門為主,不作過多展開,我寫東西如果開頭標了實戰二字,必然會保證讀者能夠獲取源代碼並且能夠按要求做的話一定能跑起來,否則沒有意義。 【環境說明:】 jdk8,eclipse4.7,hibernate4.3.11,mys ...
  • 上一篇介紹了Servlet初始化,以及如何處理HTTP請求,實際上在這兩個過程中,都伴隨著Servlet的生命周期,都是Servlet生命周期的一部分。同時,由於Tomcat容器預設是採用單實例多線程的方式處理多個請求,這一特性就導致了線程安全問題的存在。因此,本篇主要講述Servlet生命周期與線 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...