一個工作了7年的粉絲,遇到了一個Zookeeper的問題。
因為接觸過Zookeeper這個技術,不知道該怎麼回答。
我說一個工作了7年的程式設計師,沒有接觸過主流技術,這不正常。
於是我問了他工資以後,我理解了!
好吧,關於“Zookeeper中Watch機制的實現原理”,看看普通人和高手的回答。
普通人:
嗯。。。。。。。。。。。。。。。
高手:
好的,這個問題我打算從兩個方面來回答。
Zookeeper是一個分散式協調元件,為分散式架構下的多個應用元件提供了順序訪問控制能力。
它的資料儲存採用了類似於檔案系統的樹形結構,以節點的方式來管理儲存在Zookeeper上的資料。
Zookeeper提供了一個Watch機制,可以讓客戶端感知到Zookeeper Server上儲存的資料變化,這樣一種機制可以讓Zookeeper實現很多的場景,比如配置中心、註冊中心等。
Watch機制採用了Push的方式來實現,也就是說客戶端和Zookeeper Server會建立一個長連線,一旦監聽的指定節點發生了變化,就會通過這個長連線把變化的事件推送給客戶端。
Watch的具體流程分為幾個部分:
- 首先,是客戶端通過指定命令比如
exists
、get
,對特定路徑增加watch 然後服務端收到請求以後,用HashMap儲存這個客戶端會話以及對應關注的節點路徑,同時客戶端也會使用HashMap
儲存指定節點和事件回撥函式的對應關係。
- 當服務端指定被watch的節點發生變化後,就會找到這個節點對應的會話,把變化的事件和節點資訊發給這個客戶端。
- 客戶端收到請求以後,從ZkWatcherManager裡面對應的回撥方法進行呼叫,完成事件變更的通知。
以上就是我對這個問題的理解!
總結
這個面試題呢,我認為考察的價值也很大,其實對於服務端的資料變更通知,
無非就是pull和push兩種方案,而這道題裡面涉及到的技術點就是push的實現。
在業務開發裡面,也可能會涉及到類似的場景,比如訊息通知,掃碼登入等。
如果你瞭解這些思想,那在解決這類問題的時候,會變得更加從容。
本期的普通人VS高手面試系列就到這裡結束了。
需要高手面試文件(附贈阿里內部十萬字面試文件)或者有不懂的技術面試題想諮詢的小夥伴可以私信或者評論區留言。
版權宣告:本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自Mic帶你學架構
!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注同名微信公眾號獲取更多技術乾貨!