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 { &