〇、環境
zk client: github.com/samuel/go-zookeeper
一、zk client狀態
zookeeper是一款流行的分布式協調組件,被廣泛用于leader選舉、分布式鎖、服務發現、名稱服務、配置中心等場景,
1. 狀態含義
zk client與zk server在建立連接、保持連接、斷開連接的程序中,會經歷各種狀態,如下所示
const (
// 暫未使用
StateUnknown State = -1
// 與zk server之間的連接斷開(也包含初始狀態),此時zk client會不斷重連
StateDisconnected State = 0
// 與zk server建立連接之前的暫時狀態,表示即將connect zk server
StateConnecting State = 1
// 暫未使用
StateAuthFailed State = 4
// 暫未使用
StateConnectedReadOnly State = 5
// 暫未使用
StateSaslAuthenticated State = 6
// 在和zk server重新建立TCP連接之后,握手階段發現session超時
StateExpired State = -112
// 在和zk server成功建立TCP連接之后的狀態
StateConnected = State(100)
// 和zk server成功建立TCP連接,并且成功握手(即成功創建session)
StateHasSession = State(101)
)
2. 狀態轉換
二、超時時間
超時時間很大程度上影響了上述狀態的轉換,有三個超時時間值得關注:
- sessionTimeout: session超時,當client與某個zk server連接例外時,會重連連接其他zk server,只要在sessionTimeout之內成功建立TCP連接并握手成功,臨時節點、watcher都會作為已有session的資源得到保留,特別要注意的是,sessionTimeout并非完全由client端設定,它由client和server端協商確定:它必須介于server端配置的sessionTimeout上限和下限之間,
- pingInterval: 是zk client和server保持心跳的時間間隔,默認1/3 * sessionTimeout
- recvTimeout:默認2/3 * sessionTimeout,client端發送請求和接收回應(包含心跳)的超時時間,另外client握手階段的讀寫超時為10 * recvTimeout,
- connectTimeout: client端與zk server建立TCP連接的超時
func (c *Conn) setTimeouts(sessionTimeoutMs int32) {
c.sessionTimeoutMs = sessionTimeoutMs
sessionTimeout := time.Duration(sessionTimeoutMs) * time.Millisecond
c.recvTimeout = sessionTimeout * 2 / 3
c.pingInterval = c.recvTimeout / 2
}
三、例外處理
// Connect establishes a new connection to a pool of zookeeper
// servers. The provided session timeout sets the amount of time for which
// a session is considered valid after losing connection to a server. Within
// the session timeout it's possible to reestablish a connection to a different
// server and keep the same session. This is means any ephemeral nodes and
// watches are maintained
如果client和server端連接發生例外,可分為三種情況:
- 一直無法成功建立連接,此時zk client在connect()中死回圈,此時zk服務處于不可用狀態,用戶可根據業務的具體情況,讓應用或退出,或降級,或死回圈直到zk服務恢復,
- sessionTimeout內成功建立連接,臨時節點和watcher得以保留,不做任何處理
- sessionTimeout內沒有成功建立連接,但是后來成功了,此時應用應當重置內部與zk相關的狀態,或者主動退出,
推薦閱讀
- STL原始碼分析--記憶體分配器
- STL原始碼分析--vector
- STL原始碼分析--string
- STL原始碼分析--list
- STL原始碼分析--hashtable
- STL原始碼分析--deque
- STL原始碼分析--iterator
- STL原始碼分析--traits
- STL原始碼分析--rbtree
- STL原始碼分析--bitset
- STL原始碼分析--algorithm
- STL原始碼分析--functional
更多精彩內容,請掃碼關注微信公眾號:后端技術小屋,如果覺得文章對你有幫助的話,請多多分享、轉發、在看,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/264050.html
標籤:Go
下一篇:HTTPS:網路安全攻堅戰

