zookeeper常常在微服務(wù)系統(tǒng)中扮演核心的角色,我們?cè)谑褂脄ookeeper時(shí)也遇到了一些容易犯的坑。比如某個(gè)時(shí)間突然發(fā)現(xiàn)rpc server流量沒(méi)了,上去服務(wù)看了下zk連接還在,進(jìn)一步發(fā)現(xiàn)臨時(shí)節(jié)點(diǎn)沒(méi)了...跟了下rpc server的日志看到,見(jiàn)截圖:

參考下代碼注釋:
`
const (
StateUnknown State = -1
StateDisconnected State = 0
StateConnecting State = 1
StateAuthFailed State = 4
StateConnectedReadOnly State = 5
StateSaslAuthenticated State = 6
StateExpired State = -112
StateConnected = State(100)
StateHasSession = State(101)
)
const (
FlagEphemeral = 1
FlagSequence = 2
)
`
可以看到,client斷開(kāi)連接后重連,session過(guò)期后也重新創(chuàng)建了。但是,server創(chuàng)建的臨時(shí)節(jié)點(diǎn)消失了。原來(lái),zookeeper的臨時(shí)節(jié)點(diǎn)、watcher等都是和session綁定的!而一旦session過(guò)期,zookeeper server就會(huì)清除和session有關(guān)的這些狀態(tài)和數(shù)據(jù)。client要做的就是重建連接,重新創(chuàng)建臨時(shí)節(jié)點(diǎn),重新watch。另外watch本身也有要注意的,收到事件通知后,需要重新注冊(cè)watcher。