1. 程式人生 > >zookeeper分散式鎖理解

zookeeper分散式鎖理解

分散式鎖的意思是,我們知道,一個應用請求服務叢集,往往是多執行緒請求的,甚至是多個應用,每個應用多條執行緒同時請求的,那麼當我們有某個需求,不希望多併發執行,只希望一條一條執行緒,一個一個請求排隊執行,比如應用程式修改zookeeper的某個節點,而這個節點是一個叢集的配置,那麼我只希望一條執行緒去統一修改配置,而不希望併發去修改配置;再如,我希望hadoop叢集同一時間只執行一個mapReduce包,整個伺服器資源都能全力執行這個任務;這些時候,我們往往想到的是佇列,將你的任務放到佇列裡面,讓佇列挨個執行,但是你要知道,佇列是非阻塞的,而我們現在需要的是“應用程式→請求叢集服務→反饋給客戶端”,這是有流程的,佇列是,你將任務扔到佇列裡面,佇列不會給每個執行緒即時反饋的,而我雖然需要排隊執行,讓任務不受其他執行緒干擾,但是我又需要完成任務後即時得到反饋,它其實是讓執行緒處於一個阻塞的過程,如果是單點應用程式,我們可以給方法加鎖(用synchronized),但是現在這是分散式應用程式,程式分佈在不同程序中的,而程序是沒辦法干預程序的,所以這叫分散式鎖,給分散式的執行緒加鎖。

         瞭解了概念之後,我們說說原理,當應用程式啟動後,每個應用程式的每條執行緒接收到請求都在zookeeper的某個父znode上下寫上一個臨時性的子znode,然後每個執行緒都監聽在它的前一個znode,就相當於排隊上廁所,這些子znode就相當於排隊的人,我看輪到我上廁所沒,肯定盯著我前一個人,如果前一個人上完廁所,走了,我前面沒人了,那就輪到我了,這裡注意,前一個人走了,不一定表示就輪到了,可能是他臨時有事離開了,如果我的前面依然還有人,這時我應該再盯著我現在前面的一個人,直到我前面一個人消失了,並且前面再沒有人了,就輪到我了,所以現在每個執行緒都監聽在它的前一個子znode上,直到子znode消失了,證明它對應的執行緒執行完了,那麼zookeeper會通知下一個子znode對應的執行緒。原理就是這樣,當不同程序的不同執行緒都在

zookeeper中寫順序的子znode,同時監聽在它的前一個子znode上,然後等在那裡,當zookeeper通知某執行緒,他的前一個znode已經消失了,那麼執行緒繼續跑,檢查前面還有沒有子znode了,如果沒有,證明輪到自己執行了。這就是分散式鎖的原理,實際上應該叫分散式執行緒鎖,非分散式的執行緒鎖(單程序的執行緒鎖)我們用synchronized讓執行緒阻塞,如果是分散式的執行緒鎖,我們不能使用佇列,因為佇列是非阻塞的,而我們需要阻塞的時候,就需要理解上面的原理。