1. 程式人生 > >zookeeper的重連思考

zookeeper的重連思考

先談談watcher和watcheEvent

剛學zookeeper的時候,都會被坑一次,以為watcher的監聽是永久的。其實不然,watcher在大多數時候都只調用一次。
zookeeper使用HashMap<Path,Watcher>維護了所有路徑的watcher,

private static class ZKWatchManager implements ClientWatchManager {    
private final Map<String, Set<Watcher>> dataWatches = new HashMap<String
, Set<Watcher>>(); private final Map<String, Set<Watcher>> existWatches = new HashMap<String, Set<Watcher>>(); private final Map<String, Set<Watcher>> childWatches = new HashMap<String, Set<Watcher>>();

所有不論註冊多少次,都只會有一個watcher存在。當watcheEvent產生的時候,會移除對應path的watcher,並且回撥。

然而,當type=None的時候,就不會移除watcher,會向所有watcher傳送事件。


Paste_Image.png

何時會產生type=None的事件呢?狀態轉變的時候!


Paste_Image.png

初始化的sessionState=Disconnected
所以第一次ping成功,(zookeeper client會不斷的給server傳送ping指令)
會產生一個watchEvent:State=SyncConnected,type=None
此時sessionState=SyncConnected,所以後續的ping就不會產生事件了。
當zk監聽watcher的時候,如果發生網路斷鏈,且在sessionTimeout/2的時間內都沒有恢復連線。
那麼所有註冊的watcher都會接收到
state=Disconnected,type=None,path=Null的watchEvent


此時sessionState=Disconnected..

  • 如果在剩下sessionTimeout/2的時間內恢復連線,即ping通了
    那麼就會收到watchEvent:state=SyncConnected,type=None,path=Null
  • 如果超過sessionTimeout時間恢復連線,那麼就會收到
    watchEvent:state=Expired,type=None,path=Null
    此時表示zookeeper客戶端真正與服務端失去連線,就需要重建zookeeper的客戶端了。
  • 如果超過sessionTimeout時間也沒恢復連線,只有等恢復連線才會收到Expired事件。
所以對於watcheEvent的事件的處理方式是:
  • DisConneted 無視,因為連不上你做啥事都沒用,也就改改某些狀態,能連上的話要麼收到SyncConneted事件,要麼收到Expired 事件
  • Expired重新構建zookeeper客戶端。
  • SyncConnected
    • 對於type!=None重新註冊watcher.
    • 對於監聽的type做後續處理

再談談zookeeper客戶端操作的Code

  • 同步操作會收到KeeperException
  • 非同步操作會收到rc
    對於KeeperException 可以使用code()得到Code,對於rc,可以使用KeeperException.Code.get(rc)得到Code

Code表示你這次操作的結果

例如對於delete(path,version)

  • 如果節點存在那麼會收到ok
  • 如果節點不存在那麼會收到NoNode

那麼如果是斷連呢?

  • 如果正處於斷連,那麼會產生ConnectionLoss。
  • 如果sessionExpired或者zookeeper.close那麼會收到sessionExpired
所以對於rc處理方式是:
  • ConnectionLoss,區域性重試
  • sessionExpired,重建zookeeper客戶端
  • 其他,業務邏輯處理。

對於zookeeper的初略理解,有問題可以指點指點。
另外關於測試。
模擬zookeeper的sessionExpired可以看看curator的KillSession

相關推薦

zookeeper思考

先談談watcher和watcheEvent 剛學zookeeper的時候,都會被坑一次,以為watcher的監聽是永久的。其實不然,watcher在大多數時候都只調用一次。 zookeeper使用HashMap<Path,Watcher>維護了所有路徑的w

Zookeeper 機制

static proc public ssi byte[] rgs long zookeeper 10.10 Zookeeper 重連機制 public class ZKConnectSessionWatcher implements Watcher {

關於資料庫斷線的一點點思考

最近在寫資料庫連結池,一個不可逃避的問題就是資料庫斷線重連。 查了很多資料,因為公司有很多專案用了 TP5 於是也去看了它的原始碼。 tp5的實現其實很簡單,配置了一些資料庫連線相關的錯誤資訊關鍵詞(句),然後在執行語句時 catch 異常資訊進行比對: // 伺服器斷線標識字元 p

(六)、ZooKeeper自動

       在一套分散式的online services系統中,各service通常不會放在一臺伺服器上,而是通過Zookeeper這樣的東西,將自己的service資訊註冊到上面,service的使用者通過Zookeeper來發現各service的資訊,從而可以將req

解決連線伺服器zookeeper時報以下錯誤 並且大量連線斷開

likely server has closed socket, closing socket connection and attempting reconnect 解決方法: 1 檢視伺服器zookeeper是否正常開啟 2 檢察防火牆是否關閉(有時重啟會開啟)

zookeeper 的斷線實現

ZooKeeper是一個分散式的,開放原始碼的分散式應用程式協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要元件。 我們可以使用zookeeper做程式的健康監測(EPHEMERAL 臨時節點)、公共配置檔案、叢集管理(leader

解Bug之路-dubbo應用無法zookeeper

## 前言 dubbo是一個成熟且被廣泛運用的框架。饒是如此,在某些極端條件下基於dubbo的應用還會出現無法重連zookeeper的問題。由於此問題容易導致比較大的故障,所以筆者費了一番功夫去定位,現將排查過程寫成博文分享出來。 ## Bug現場 這是一起在測試環境出現的故障。起因是網工做交換機切換演練,可

mysql接丟失:The last packet successfully received from the server

sts one rac name java nes over href deb 原文地址:http://nkcoder.github.io/blog/20140712/mysql-reconnect-packet-lost/ 1.1 錯誤信息: Caused by: com

WebSocket安卓客戶端實現詳解(一)–接建立與

ask 應該 header oid mha 主動推送 未收到 compile tde http://blog.csdn.net/zly921112/article/details/72973054 前言 這裏特別說明下因為WebSocket服務端是公司線上項目所以這裏ur

Jboss數據庫接斷開自動

jbossJboss默認配置是數據庫連接端口後,服務就會出現異常,無法訪問,此時必須重啟Jboss服務才能重新連接上數據庫。在jboss/server/defult/deploy/oracle-ds.xml中加入:<new-connection-sql>select 1 from dual<

移動平臺遊戲網絡方案(轉)

操作 三種 劃分 使用 遊戲服 class 排行 統計 3.4  1、背景  移動網絡信號波動頻繁,給移動遊戲開發者帶來諸多困擾,處理不好會造成較差的用戶體驗以及重復扣道具等嚴重問題。因此弱網絡問題在TDR技術評審中作為客戶端重點挑戰項,並且弱網絡專項測試達標後方能上線。本

簡易RPC框架-心跳與機制

依賴 tile tegra port public row edi cat ice 心跳 就是告訴其它人自己還活著。在簡易RPC框架中,采用的是TCP長連接,為了確保長連接有效,就需要客戶端與服務端之間有一種通知機制告知對方的存活狀態。 如何實現 客戶端發

nodejs中mysql斷線

調試 狀態 pan var 參考 ble prot nec clas 之前寫了個小程序Node News,用到了MySQL數據庫,在本地測試均沒神馬問題。放上服務器運行一段時間後,偶然發現打開頁面的時候頁面一直處於等待狀態,直到Nginx返回超時錯誤。於是上服務器檢查了遍,

[轉]樹莓派.設置自動WiFi

system init.d defaults href ans start class ati call 由於不可知的原因,有可能會導致樹莓派失去連接,這時候需要重新連接WiFi。 自動重連的原理是,定期查看是否斷網,如果斷網了重啟WiFi,參考的文章是這篇,第一步略有修

Delphi使用ADO接網絡數據庫,斷網後問題

無法 create exit eat bject sender class exce cep 原始文章: https://blog.csdn.net/blog_jihq/article/details/11737699# 使用TADOConnection對象連接網絡數據庫

說說“用戶無線網絡時不時斷開”的故障!

protocol bit 觀察 stat *** 一段 官方 查看 為什麽 故障現象:用戶反映很多的人的筆記本連接無線時,不定時的就會斷開無線網絡,然後重新連接。網絡環境:1、所有AP由無線控制器統一管理,采用本地轉發,品牌為優科。2、所有AP由思科2960 POE交換機提

TCP自動

list save Coding locale [] ext eat blocking one 網上模板: public class Socket_wrapper { public static Socket theSocket = nul

關於數組去思考

bsp foreach 怎樣 問題 [] 重復元素 試題 arr reac 平時在項目開發中很少遇到一些數組去重的操作,但是每次想去跳槽刷面試題的時候就會看到這個問題?數組去重我們該怎樣思考??了?   一. 首先想到的是去遍歷這個數組,for、forEach

關於can 出錯

1.CAN協議的定義:      CAN匯流排使用序列資料傳輸方式,當can總線上的一個節點站傳送資料,它以報文形式廣播給網路中所有的節點。對於每隔節點來說,無論資料是不是發給自己的,都對其進行接受。 2.CAN 錯誤的種類: 1.)主動錯誤:(主

android 實現mqtt訊息推送,以及不停斷線的問題解決

前段時間專案用到mqtt的訊息推送,整理一下程式碼,程式碼的原型是網上找的,具體哪個地址已經忘記了。 程式碼的實現是新建了一個MyMqttService,全部功能都在裡面實現,包括連伺服器,斷線重連,訂閱訊息,處理訊息,釋出訊息等基本操作。 首先新增依賴: dependencies { &