1. 程式人生 > >ZooKeeper監聽機制

ZooKeeper監聽機制

在ZooKeeper中,所有的讀操作(getData,getChildren和exists)都可以設定監聽。監聽在某些場景下是非常有用的,當你關注某些資料的變化時,如果沒有監聽,你就只能不斷的輪詢檢視資料是否發生了改變,而監聽則可以避免輪詢帶來的開銷。

設定監聽

ZooKeeper的監聽事件僅觸發一次,監聽事件非同步通知客戶端,並支援多種監聽方式。

  1. 僅觸發一次
    當資料改變時,一個監聽事件被髮送到客戶端,並取消監聽,除非客戶端再次設定監聽,否則不再監聽。
    如果你呼叫了getData(“/znode1”, true)方法,第二個引數true表示設定監聽,後續如果/znode1發生了改變或刪除,客戶端將收到監聽訊息。而如果/znode1再次發生改變,除非客戶端執行了另一個設定監聽的get操作,否則不會再收到監聽訊息。
    應用使用ZooKeeper的監聽功能的通常方式為:
    1. 客戶端對特定物件設定監聽;
    2. 特定物件發生變化,服務端傳送監聽訊息到客戶端,並取消監聽;
    3. 客戶端收到監聽訊息,發起查詢,並根據需要決定是否再次監聽。
    ZooKeeper保證查詢和監聽是一個原子操作,客戶端查詢資料之後的所有資料變化都能收到監聽。
  2. 傳送到客戶端
    要求操作必須成功返回到發起操作的客戶端後,才能傳送通知訊息。監聽被非同步傳送給監聽者。ZooKeeper提供了順序的保證:一個設定了監聽的客戶端在收到監聽事件之前不會看到資料變化。
  3. 監聽方式
    這涉及到資料改變的不同方式,ZooKeeper服務端維護了兩個監聽佇列:資料監聽佇列和孩子監聽佇列。getData()和exists()設定資料監聽,getChildren()設定孩子監聽。setData()將觸發資料監聽,create()將觸發一個節點被建立的資料監聽和孩子變化的孩子監聽,delete()同樣將觸發一個數據監聽和孩子監聽。

監聽資訊在ZooKeeper的服務端維護,是一個輕量級操作。當一個客戶端連線到一個新服務端時,監聽將被觸發。在客戶端與服務端斷開連線後,監聽將不能傳送到客戶端,當客戶端重連後,任何先前的註冊監聽將自動重新註冊並根據情況觸發,整個過程自動完成。
存在一種情況將出現監聽事件丟失:當客戶端與服務端斷開連線期間,一個被監聽的節點建立並且被刪除,客戶端將收不到任何監聽事件。
ZooKeeper服務端的監聽列表僅儲存在記憶體中,不做持久化。當一個客戶端與服務端斷開連線後,它所有的watch都會從記憶體中移除,客戶端會在重連後自動重新註冊它的所有watch。

監聽事件

ZooKeeper提供了以下幾種事件型別,下面描述了監聽這些事件的方法:

  1. Created event:呼叫exists方法設定監聽;
  2. Deleted event:呼叫exists、getData、getChildren設定監聽;
  3. Changed event:呼叫getData設定監聽;
  4. Child event:呼叫getChildren設定監聽。

取消監聽

客戶端能夠取消監聽,即使連線斷開,客戶端仍然能夠通過設定本地標誌來取消監聽,取消監聽成功後將收到以下事件:
1. Child Remove event:取消getChildren呼叫註冊的監聽成功;
2. Data Remove event:取消exists和getData呼叫註冊的監聽成功。

ZooKeeper對監聽提供的保障

關於監聽,ZooKeeper提供了以下保障:
1. 監聽是有序的,ZooKeeper客戶端庫確保事件、監聽和非同步應答的按序分發;
1. 客戶端在看到一個節點的新資料之前,將先看到該節點的監聽事件;
2. ZooKeeper的監聽事件的順序和ZooKeeper服務檢視到的更新的順序是一致的。

注意事項

使用ZooKeeper的監聽機制,你需要注意:
1. 監聽僅觸發一次;如果你收到了一個監聽事件並且想要繼續監聽,你必須再次設定監聽;
2. 由於監聽是一次性的,並且在你收到監聽訊息和傳送一個新請求(再次監聽)之間存在延遲,因此你不能保證看到節點的每次改變。因此你的應用邏輯不應該依賴監聽節點的每次變化;
3. 對於一個通知訊息一個監聽物件僅會被觸發一次。例如,如果同樣的監聽物件被同時註冊監聽exists和getData,當物件被刪除時,監聽物件將僅被呼叫一次傳送刪除通知;
4. 當客戶端和服務端斷開連線時(例如服務端掛了),你將不會得到任何監聽訊息直到連線重建。由於這個原因,session事件將被髮送給所有監聽事件處理器,通知他們進入安全模式:在斷鏈期間你將不能接收監聽訊息,需要謹慎行事。

相關推薦

ZooKeeper機制

在ZooKeeper中,所有的讀操作(getData,getChildren和exists)都可以設定監聽。監聽在某些場景下是非常有用的,當你關注某些資料的變化時,如果沒有監聽,你就只能不斷的輪詢檢視資料是否發生了改變,而監聽則可以避免輪詢帶來的開銷。 設

ZooKeeper Watcher機制(資料變更的通知)(二)(分析)

緊接著上一篇部落格:https://blog.csdn.net/Dongguabai/article/details/82970852 在輸出內容中有這樣兩個結果: 在ZooKeeper中,介面類Watcher用於表示一個標準的事件處理器,其定義了事件通知相關的邏輯,包含Ke

Zookeeper機制api與原理

1.連線Zookeeper,註冊監聽 ZooKeeper zkCli = new ZooKeeper("192.168.50.183:2181,192.168.50.184:2181,192.168.50.185:2181", 3000, new Watcher() { //

zookeeper內部機制與註冊機制

zookeeper應用:You can use it off-the-shelf to implement consensus, group management, leader election, and presence protocols. And

zookeeper 事件機制

1、概述 上一篇文章,我們對zookeeper中的資料組織結構、Leader選舉原理進行了講述(http://blog.csdn.net/yinwenjie/article/details/47613309)。這篇文章我們緊接上文講解zookeeper中的事件機制。並通過示

java中的key事件機制

com java.awt imp package 時間 ext javax .get pri package com.at221; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; im

Java 中的事件機制

add import userdata 開發人員 util ner dns pre sta 看項目代碼時遇到了好多事件監聽機制相關的代碼。現學習一下: java事件機制包含三個部分:事件、事件監聽器、事件源。 1.事件:繼承自java.util.EventO

Java中的事件機制

void 初始化 release vax 輸入 logs p s get location 鼠標事件監聽機制的三個方面: 1.事件源對象:   事件源對象就是能夠產生動作的對象。在Java語言中所有的容器組件和元素組件都是事件監聽中的事件源對象。Java中根據事件的動作來區

JAVA 圖形開發之計算器設計(事件機制

oncommand image 事件監聽 str one 創建 dac orm mat /*文章中用到的代碼只是一部分,需要源碼的可通過郵箱聯系我 [email protected]*/ 前段時間剛幫同學用MFC寫了個計算器,現在學到JAVA的圖形開發,就試著水了一個計算器

Java事件機制與觀察者設計模式

idea demo1 script 操作 alt face ner over 方法 一. Java事件監聽機制 1. 事件監聽三要素: 事件源,事件對象,事件監聽器 2. 三要素之間的關系:事件源註冊事件監聽器後,當事件源上發生某個動作時,事件源就會調用事件監聽的一個方法,

spring事件機制

ide could 事情 task object 負責 his try and 事件機制的主要成員:   事件 事件監聽器(監聽事件觸發,處理一些事情) 事件源(發布事件) javaSE 提供了一系列自定義事件的標準。 EvenObject,為javaSE提供

UGUI的事件機制

UGUI控制元件的事件響應有很多種方式,比如使用元件EventTrigger來新增事件監聽,或者實現IDragHandler等介面,或者更直接地繼承EventTrigger來進行更靈話的呼叫。 下面分別就上面3種監聽方式進行講解,這些例子都是實現拖動Image的功能。 一、使用元件Event

自定義JAVA事件機制

JAVA中的事件機制的參與者有3種角色:Event、EventSource、Listener 1.Event:就是事件產生時具體的“事件”,用於Listener的相應的方法之中,作為引數一般存在於Listener的方法之中。 2.EventSource:事件源,它的作用主要是對事件和監聽進行

深入理解Spring的容器內事件釋出機制

目錄 1. 什麼是事件監聽機制 2. JDK中對事件監聽機制的支援 2.1 基於JDK實現對任務執行結果的監聽 3.Spring容器對事件監聽機制的支援 3.1 基於Spring實現對任務執行結果的監聽 4.Spring事件監聽原始碼解析

深入理解Spring的容器內事件發布機制

not main alt 事件類型 http inner interface 改變 pear 目錄 1. 什麽是事件監聽機制 2. JDK中對事件監聽機制的支持 2.1 基於JDK實現對任務執行結果的監聽 3.Spring容器對事件監聽機制的支持 3.1 基於Sprin

Java的GUI學習四(事件機制)

事件監聽機制的特點:   1.事件源2.事件3.監聽器4.事件處理 比如密碼鎖設為(事件源) 將報警裝置裝的密碼鎖上。。。(時刻都有監聽器)  監聽器要註冊到事件源上面 如果有錘子砸(外部動作,如果是摸的話就沒有關係)密碼鎖。(事件產生了,封裝成物件,

為什麼Proxy可以優化vue的資料機制

我們首先來看vue2.x中的實現,為簡單起見,我們這裡不考慮多級巢狀,也不考慮陣列 vue2.x中的實現 其本質是new Watcher(data, key, callback)的方式,而在呼叫之前是先將data中的所有屬性轉化成可監聽的物件, 其主要就是利用Object.defineProperty,。

Zookeeper伺服器節點動態上下線案例

需求: 某分散式系統中,主節點可以有多臺,可以動態上下線,任意一臺客戶端都能實時感知到主節點伺服器的上下線 服務端程式碼 package com.zyd.zook; import java.io.IOException; import org.apache.zookee

JavaScript基礎(六)事件機制

事件監聽機制: * 概念:某些元件被執行了某些操作後,觸發某些程式碼的執行。 * 事件:某些操作。如: 單擊,雙擊,鍵盤按下了,滑鼠移動了 * 事件源:元件。如: 按鈕 文字輸入框... * 監聽器:程式碼。 * 註冊監聽:將事件,事件源,監聽器結合在

springboot的時間機制

配置在META-INF/spring.factories ApplicationContextInitializer public class HelloApplicationContextInitializer implements ApplicationContextInitialize