Zookeeper:事件監聽和通知機制

Zookeeper 允許客戶端向服務端的某個 Znode 注冊一個 Watcher 監聽,當服務端的一些指定事件觸發了這個 Watcher,服務端會向指定客戶端發送一個事件通知來實現分布式的通知功能,然后客戶端根據 Watcher 通知狀態和事件類型做出業務上的改變。

~

本篇內容包括:關于觀察者模式、Zookeeper 事件監聽和通知機制、Zookeeper 工作流程


文章目錄

    • 一、關于觀察者模式
        • 1、觀察者模式
        • 2、發布-訂閱模式
        • 3、Zookeeper 中的觀察者模式
    • 二、Zookeeper 事件監聽和通知機制
        • 1、Zookeeper Watcher 機制
        • 2、Watcher 特性
    • 三、Zookeeper 工作流程
        • 1、客戶端注冊 Watcher
        • 2、服務器處理 Watcher
        • 3、客戶端回調 Watcher


一、關于觀察者模式

1、觀察者模式

觀察者模式定義了對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都將得到通知,并自動更新。觀察者模式屬于行為型模式,行為型模式關注的是對象之間的通訊,觀察者模式就是觀察者和被觀察者之間的通訊。觀察者模式有一個別名叫“發布-訂閱模式”,或者說是“訂閱-發布模式”,訂閱者和訂閱目標是聯系在一起的,當訂閱目標發生改變時,逐個通知訂閱者。

  • 作用:一個對象狀態改變給其他對象通知的問題,而且要考慮到易用和低耦合,保證高度的協作。
  • 優點:
    1. 觀察者和被觀察者是抽象耦合的
    2. 建立一套觸發機制
  • 缺點
    1. 如果一個被觀察者對象有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間。
    2. 如果在觀察者和觀察目標之間有循環依賴的話,觀察目標會觸發它們之間進行循環調用,可能導致系統崩潰。
    3. 觀察者模式沒有相應的機制讓觀察者知道所觀察的目標對象是怎么發生變化的,而僅僅只是知道觀察目標發生了變化。

2、發布-訂閱模式

發布-訂閱模式并不屬于 24 種基本的設計模式,起初只是觀察者模式的一個別稱,但是經過時間的沉淀,似乎他已經強大了起來,已經獨立于觀察者模式,成為另外一種不同的設計模式。

現在的發布訂閱模式中,稱為發布者的消息發送者不會將消息直接發送給訂閱者,這意味著發布者和訂閱者不知道彼此的存在。在發布者和訂閱者之間存在第三個組件,稱為消息代理或調度中心或中間件,它維持著發布者和訂閱者之間的聯系,過濾所有發布者傳入的消息并相應地分發它們給訂閱者。

  • 作用:發布-訂閱模式是前端常用的一種設計模式,現在主流的 MVVM 框架,都大量使用了此設計模式,其主要作用有以下兩點:
    • 可以實現模塊間通信
    • 可以在一定程度上實現異步編程
  • 優點:
    • 支持簡單的廣播通信,當對象狀態發生改變時,會自動通知已經訂閱過的對象(我們日常工作中也經常使用到,比如我們的 ajax 請求,請求有 successerror 的回調函數,我們可以訂閱 ajax 的 successerror 事件。我們并不關心對象在異步運行的狀態,我們只關心 success 的時候或者 error 的時候我們要做點我們自己的事情就可以了~)。
    • 發布者與訂閱者耦合性降低,發布者只管發布一條消息出去,它不關心這條消息如何被訂閱者使用,同時,訂閱者只監聽發布者的事件名,只要發布者的事件名不變,它不管發布者如何改變
  • 缺點
    • 創建訂閱者需要消耗一定的時間和內存。
    • 雖然可以弱化對象之間的聯系,如果過度使用的話,反而使代碼不好理解及代碼不好維護等等。

3、Zookeeper 中的觀察者模式

zookeeper 從設計模式上來看,是一個基于觀察者模式設計(或者說“發布-訂閱模式”更為貼切)的分布式服務管理框架,它負責存儲和管理大家都關心的數據,然后接受觀察者的注冊,一旦這些數據的狀態發生了變化,Zookeeper 就將負責通知已經在 Zookeeper 上注冊的觀察者做出相應的反應,從而實現集群中類似 Master/slave 管理模式。


二、Zookeeper 事件監聽和通知機制

1、Zookeeper Watcher 機制

Zookeeper 允許客戶端向服務端的某個 Znode 注冊一個 Watcher 監聽,當服務端的一些指定事件觸發了這個 Watcher,服務端會向指定客戶端發送一個事件通知來實現分布式的通知功能,然后客戶端根據 Watcher 通知狀態和事件類型做出業務上的改變。

Watcher 基于 Zookeeper 上創建的 Znode 節點,可以對這些節點綁定監聽事件,比如可以監聽節點數據變更、節點刪除、子節點狀態變更等事件,通過這個事件機制,可以基于 Zookeeper 實現分布式鎖,發布訂閱(多個訂閱者同時監聽某一個主題對象,當這個主題對象自身狀態發生變化時,會通知所有訂閱者)等功能。

2、Watcher 特性

當數據發生變化的時候, zookeeper 會產生一個 watcher 事件,并且會發送到客戶端。但是客戶端只會收到一次通知。如果后續這個節點再次發生變化,那么之前設置 watcher 的客戶端不會再次收到消息。(Watcher 是一次性的操作,當然,可以通過循環監聽去達到永久監聽效果)。

  • 一次性:watcher 是一次性的,一旦觸發就會被移除,再次使用時需要重新注冊;
  • 客戶端順序回調:watcher 回調是順序串行執行的,只有回調后客戶端才能看到最新的數據狀態,一個 watcher 回調邏輯不應太多。以免影響其他回調 watcher 執行;
  • 輕量級:WatchEvent 是最小的通信單位,結構上只包含通知狀態、事件類型和節點路徑,并不會告訴姐點變化的前后具體內容;
  • 實效性:watcher 只有在當前 session 徹底失效時才會無效,若在 session 有效期內快速重連成功,則 watcher 依然存在,仍可接收到通知。

三、Zookeeper 工作流程

ZooKeeper 的 Watcher 機制,總的來說可以分為三個過程:客戶端注冊 Watcher、服務器處理 Watcher 和客戶端回調 Watcher 客戶端。

  1. 客戶端注冊 Watcher 到服務端;

  2. 服務端發生數據變更;

  3. 服務端通知客戶端數據變更;

  4. 客戶端回調 Watcher 處理變更應對邏輯;

1、客戶端注冊 Watcher

Zookeeper 中注冊 watcher的 接口大概有如下幾個:

  1. 建立 Zookeeper 連接時傳入的 watcher;
  2. 通過 gtData、exists、getChildren; 來設置watcher,而它們又各有同步和異步兩種形式。Zookeeper 的所有讀操作都可以設置 watch 監視點: getData, getChildren, exists. 寫操作則是不能設置監視點的。

監視有兩種類型:數據監視點和子節點監視點。創建、刪除或者設置znode都會觸發這些監視點。exists,getData 可以設置數據監視點。getChildren 可以設置子節點變化。而可能監測的事件類型有: None、NodeCreated、NodeDataChanged、NodeDeleted、NodeChildrenChanged。

 None // 客戶端連接狀態發生變化的時候 會收到None事件NodeCreated // 節點創建事件   NodeDeleted // 節點刪除事件NodeDataChanged // 節點數據變化NodeChildrenChanged // 子節點被創建 刪除觸發該事件

# 客戶端注冊流程:

  1. 調用 getData()/getChildren()/exist()三個 API,傳入 Watcher 對象
  2. 標記請求 request,封裝 Watcher 到 WatchRegistration
  3. 封裝成 Packet 對象,發服務端發送 request
  4. 收到服務端響應后,將 Watcher 注冊到 ZKWatcherManager 中進行管理
  5. 請求返回,完成注冊。

2、服務器處理 Watcher

# 服務端接收 Watcher 并存儲

接收到客戶端請求,處理請求判斷是否需要注冊 Watcher,需要的話將數據節點的節點路徑和 ServerCnxn(ServerCnxn 代表一個客戶端和服務端的連接,實現了 Watcher 的 process 接口,此時可以看成一個 Watcher 對象)存儲在WatcherManager 的 WatchTable 和 watch2Paths 中去。

# Watcher 觸發
以服務端接收到 setData() 事務請求觸發 NodeDataChanged 事件為例:

  • 封裝 WatchedEvent:將通知狀態(SyncConnected)、事件類型(NodeDataChanged)以及節點路徑封裝成一個 WatchedEvent 對象
  • 查詢 Watcher:從 WatchTable 中根據節點路徑查找 Watcher
  • 沒找到:說明沒有客戶端在該數據節點上注冊過 Watcher
  • 找到:提取并從 WatchTable 和 Watch2Paths 中刪除對應 Watcher(從這里可以看出 Watcher 在服務端是一次性的,觸發一次就失效了)

# 調用 process 方法來觸發 Watcher
這里 process 主要就是通過 ServerCnxn 對應的 TCP 連接發送 Watcher 事件通知。

3、客戶端回調 Watcher

客戶端 SendThread 線程接收事件通知,交由 EventThread 線程回調 Watcher。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535445.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535445.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535445.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux namespace之:mount namespace

理解mount namespace 用戶通常使用mount命令來掛載普通文件系統,但實際上mount能掛載的東西非常多,甚至連現在功能完善的Linux系統,其內核的正常運行也都依賴于掛載功能,比如掛載根文件系統/。其實所有的掛載功能和掛載信息都由內…

Linux namespace之:network namespace

理解network namespace network namespace用來隔離網絡環境,「在network namespace中,網絡設備、端口、套接字、網絡協議棧、路由表、防火墻規則等都是獨立的」。 因network namespace中具有獨立的網絡協議棧,因此每個network namespace中都…

Kubernetes 的原理

kubernetes 已經成為容器編排領域的王者,它是基于容器的集群編排引擎,具備擴展集群、滾動升級回滾、彈性伸縮、自動治愈、服務發現等多種特性能力。 本文將帶著大家快速了解 kubernetes ,了解我們談論 kubernetes 都是在談論什么。 kuberne…

Zookeeper:實現“分布式鎖”的 Demo

Zookeeper 能保證數據的強一致性,用戶任何時候都可以相信集群中每個節點的數據都是相同的。一個用戶創建一個節點作為鎖,另一個用戶檢測該節點,如果存在,代表別的用戶已經鎖住,如果不存在,則可以創建一個節…

JavaIO流:案例

java.io 包下需要掌握的流有 16 個,本篇內容包括:java.io包下需要掌握的流、Java IO 案例。 文章目錄一、java.io包下需要掌握的流二、Java IO 案例1、Demo 1(FileInputStream)2、Demo 2(FileInputStream)3…

比對excel數據

#!/usr/bin/env pythonimport openpyxl from openpyxl.styles import PatternFill from openpyxl.styles import colors from openpyxl.styles import Font, Color aD:/測算單位設置/比對/吉林/tmp001.xlsx bD:/測算單位設置/比對/吉林/國網吉林電力.xlsx cD:/測算單位設置/比對…

CPU 是如何執行任務的

前言 你清楚下面這幾個問題嗎? 有了內存,為什么還需要 CPU Cache? CPU 是怎么讀寫數據的? 如何讓 CPU 能讀取數據更快一些? CPU 偽共享是如何發生的?又該如何避免? CPU 是如何調度任務的&a…

Ansible 的自動化運維

1、Ansible 特點 Ansible 自 2012 年發布以來,很快在全球流行,其特點如下: Ansible 基于 Python 開發,運維工程師對其二次開發相對比較容易; Ansible 豐富的內置模塊,幾乎可以滿足一切要求; …

Shell 信號發送與捕捉

1、Linux信號類型 信號(Signal):信號是在軟件層次上對中斷機制的一種模擬,通過給一個進程發送信號,執行相應的處理函數。 進程可以通過三種方式來響應一個信號: 1)忽略信號,即對信…

運維面試題總結

集群相關 簡述 ETCD 及其特點? etcd 是 CoreOS 團隊發起的開源項目,是一個管理配置信息和服務發現(service discovery)的項目,它的目標是構建一個高可用的分布式鍵值(key-value)數據庫&#x…

詳解設計模式:建造者模式

建造者模式(Builder Pattern)也叫做生成器模式,是 GoF 的 23 種設計模式的一種,它將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。 當我們需要實列化一個復雜的類,以得到不同結…

圖文并茂 VLAN 詳解,讓你看一遍就理解 VLAN

一、為什么需要VLAN 1.1、什么是VLAN? VLAN(Virtual LAN),翻譯成中文是“虛擬局域網”。LAN可以是由少數幾臺家用計算機構成的網絡,也可以是數以百計的計算機構成的企業網絡。VLAN所指的LAN特指使用路由器分割的網絡——也就是廣播域。 在此讓我們先復習…

認識VLAN,并學會VLAN的劃分和網絡配置實例

VLAN的劃分和網絡的配置實例 1、VLAN基礎知識 VLAN(Virtual Local Area Network)的中文名為:“虛擬局域網”,注意和VPN(虛擬專用網)進行區分。 VLAN是一種將局域網設備從邏輯上劃分(不是從物…

VLAN劃分及配置注意事項

VLAN(Virtual Local Area Network)即虛擬局域網,是將一個物理的LAN在邏輯上劃分成多個廣播域的通信技術。VLAN內的主機間可以直接通信,而VLAN間不能直接通信,從而將廣播報文限制在一個VLAN內。VLAN之間的通信是通過第3…

Docker原理剖析

一、簡介 1、了解Docker的前生LXC LXC為Linux Container的簡寫。可以提供輕量級的虛擬化,以便隔離進程和資源,而且不需要提供指令解釋機制以及全虛擬化的其他復雜性。相當于C中的NameSpace。容器有效地將由單個操作系統管理的資源劃分到孤立的組中&#…

獲取Linux內存、cpu、磁盤IO等信息

#!/bin/bash # 獲取要監控的本地服務器IP地址 IPifconfig | grep inet | grep -vE inet6|127.0.0.1 | awk {print $2} echo "IP地址:"$IP# 獲取cpu總核數 cpu_numgrep -c "model name" /proc/cpuinfo echo "cpu總核數:"$c…

Docker容器網絡解析

Docker 容器網絡的發展歷史 在 Dokcer 發布之初,Docker 是將網絡、管理、安全等集成在一起的,其中網絡模塊可以為容器提供橋接網絡、主機網絡等簡單的網絡功能。 從 1.7 版本開始,Docker正是把網絡和存儲這兩部分的功能都以插件化形式剝離出來…

將指定excel的一列數據提取到另一個excel的指定列

#!/usr/bin/env python import openpyxl bjD:/地市縣公司/西藏臺賬數據分析-設備臺帳分析.xlsx wb openpyxl.load_workbook (bj) get_sheets wb.sheetnames #print(get_sheets) TA01TA01 TA02TA02 TA03TA03 TE01TE01 YG201YG201 YG202YG202 YG203YG203 YG204YG204 YG205YG205…

Docker 數據管理介紹

默認容器的數據是保存在容器的可讀寫層,當容器被刪除時其上的數據也會丟失,所以為了實現數據的持久性則需要選擇一種數據持久技術來保存數據。官方提供了三種存儲方式:Volumes、Bind mounts和tmpfs。前面還介紹了:Docker 服務終端…

Docker 數據持久化的三種方案

容器中的數據可以存儲在容器層。但是將數據存放在容器層存在以下問題: 數據不是持久化。意思是如果容器刪除了,這些數據也就沒了 主機上的其它進程不方便訪問這些數據 對這些數據的I/O會經過存儲驅動,然后到達主機,引入了一層間…