【Java面試】Zookeeper中的Watch機制的原理?

跟著Mic學架構發表於2022-05-19

一個工作了7年的粉絲,遇到了一個Zookeeper的問題。

因為接觸過Zookeeper這個技術,不知道該怎麼回答。

我說一個工作了7年的程式設計師,沒有接觸過主流技術,這不正常。

於是我問了他工資以後,我理解了!

好吧,關於“Zookeeper中Watch機制的實現原理”,看看普通人和高手的回答。

普通人:

嗯。。。。。。。。。。。。。。。

高手:

好的,這個問題我打算從兩個方面來回答。

Zookeeper是一個分散式協調元件,為分散式架構下的多個應用元件提供了順序訪問控制能力。

它的資料儲存採用了類似於檔案系統的樹形結構,以節點的方式來管理儲存在Zookeeper上的資料。

image-20220418150841209

Zookeeper提供了一個Watch機制,可以讓客戶端感知到Zookeeper Server上儲存的資料變化,這樣一種機制可以讓Zookeeper實現很多的場景,比如配置中心、註冊中心等。

image-20220418151302479

Watch機制採用了Push的方式來實現,也就是說客戶端和Zookeeper Server會建立一個長連線,一旦監聽的指定節點發生了變化,就會通過這個長連線把變化的事件推送給客戶端。

Watch的具體流程分為幾個部分:

  • 首先,是客戶端通過指定命令比如existsget,對特定路徑增加watch
  • 然後服務端收到請求以後,用HashMap儲存這個客戶端會話以及對應關注的節點路徑,同時客戶端也會使用HashMap

    儲存指定節點和事件回撥函式的對應關係。

  • 當服務端指定被watch的節點發生變化後,就會找到這個節點對應的會話,把變化的事件和節點資訊發給這個客戶端。
  • 客戶端收到請求以後,從ZkWatcherManager裡面對應的回撥方法進行呼叫,完成事件變更的通知。

image-20220418152850371

以上就是我對這個問題的理解!

總結

這個面試題呢,我認為考察的價值也很大,其實對於服務端的資料變更通知,

無非就是pull和push兩種方案,而這道題裡面涉及到的技術點就是push的實現。

在業務開發裡面,也可能會涉及到類似的場景,比如訊息通知,掃碼登入等。

如果你瞭解這些思想,那在解決這類問題的時候,會變得更加從容。

本期的普通人VS高手面試系列就到這裡結束了。

需要高手面試文件(附贈阿里內部十萬字面試文件)或者有不懂的技術面試題想諮詢的小夥伴可以私信或者評論區留言。

file

版權宣告:本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Mic帶你學架構
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注同名微信公眾號獲取更多技術乾貨!

相關文章