原文鏈接:http://hongweiyi.com/2012/11/zookeeper-ephemeral-nodes-experience/
Zookeeper Ephemeral結點使用心得
公司里面在拿Zookeeper做命名服務,通過使用ZK,前端只需要根據指定的ZK地址獲得相應的資源或服務的后端服務器地址即可,而后端服務器需要做的僅僅是將自己的地址注冊到ZK上作為一個Ephemeral結點即可。(雖然是挺方便后端擴容,但是我個人不太建議直接上ZK,否則開發成本會增加)
P.S.:Ephemeral結點在Apache Zookeeper中是一個臨時結點,這些結點只要創建它的結點session不掛,它就一直存在,當session中止了,結點也就刪除了。
問題:
在開發的時候遇到了一個奇怪的問題,當某個后端快速重啟之后,該后端的結點信息過一段時間后會被刪除,這樣就導致了后端服務永遠無法被前端訪問到。
原因:
查了資料后得知,如果在你的session中,ephemeral結點不是由你創建的,你的session就不會擁有該結點,所以當擁有該結點的session終止(expire)了,該結點也就銷毀了。那么,如果不是你顯式的刪除該結點的話,就只能由ZK幫你終止它,在會話超時之后ZK就自動刪除結點。如果在會話還未超時的過程中(一般是30s),你重啟后端服務器的話,就會導致我所說的情況。
解決方案:
Apache提供了幾個patch,也有人提供了一些解決方案,均是顯式的終止session。但是后端服務器掛了,顯式終止一般是沒用的。找到的這個方法是比較靠譜的,那就是在創建結點前,先刪除之前的結點:
1. try { 2. zk.delete(path) 3. } catch { 4. e: NoNodeException => // do nothing 5. } 6. zk.create(path, data, CreateMode.EPHEMERAL) |
參考資料: