zookeeper分布式锁避免羊群效应(Herd Effect)
本文主要講述在使用ZooKeeper進行分布式鎖的實現過程中,如何有效的避免“羊群效應(?herd effect)”的出現。
一般的分布式鎖實現
這里簡單的講下一般的分布式鎖如何實現。具體的代碼實現可以在這里看到:https://svn.apache.org/repos/asf/zookeeper/trunk/src/recipes/lock/
在之前的《ZooKeepe數據模型》一文中提到過,zookeeper中節點的創建類型有4類,這里我們重點關注下臨時順序節點。這種類型的節點有幾下幾個特性:
利用上面這兩個特性,我們來看下獲取實現分布式鎖的基本邏輯:
釋放鎖的過程相對比較簡單,就是刪除自己創建的那個子節點即可。
問題所在
上面這個分布式鎖的實現中,大體能夠滿足了一般的分布式集群競爭鎖的需求。這里說的一般性場景是指集群規模不大,一般在10臺機器以內。
不過,細想上面的實現邏輯,我們很容易會發現一個問題,步驟4,“即獲取所有的子點,判斷自己創建的節點是否已經是序號最小的節點”,這個過程,在整個分布式鎖的競爭過程中,大量重復運行,并且絕大多數的運行結果都是判斷出自己并非是序號最小的節點,從而繼續等待下一次通知——這個顯然看起來不怎么科學。客戶端無端的接受到過多的和自己不相關的事件通知,這如果在集群規模大的時候,會對Server造成很大的性能影響,并且如果一旦同一時間有多個節點的客戶端斷開連接,這個時候,服務器就會像其余客戶端發送大量的事件通知——這就是所謂的羊群效應。而這個問題的根源在于,沒有找準客戶端真正的關注點。
我們再來回顧一下上面的分布式鎖競爭過程,它的核心邏輯在于:判斷自己是否是所有節點中序號最小的。于是,很容易可以聯想的到的是,每個節點的創建者只需要關注比自己序號小的那個節點。
改進后的分布式鎖實現
下面是改進后的分布式鎖實現,和之前的實現方式唯一不同之處在于,這里設計成每個鎖競爭者,只需要關注”_locknode_”節點下序號比自己小的那個節點是否存在即可。實現如下:
結論
上次兩個分布鎖實現,都是可行的。具體選擇哪個,取決于你的集群規模。
轉發來自:http://rdc.taobao.com/team/jm/archives/tag/zookeeper
總結
以上是生活随笔為你收集整理的zookeeper分布式锁避免羊群效应(Herd Effect)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Zookeeper的典型应用场景(2)
- 下一篇: Java:ThreadPoolExecu