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