zookeeper分布式鎖簡單實踐
在分布式解決方案中,zookeeper是乙個分布式協調工具。當多個jvm客戶端,同時在zookeeper上建立相同的乙個臨時節點,因為臨時節點路徑是保證唯一,只要誰能夠建立節點成功,誰就能夠獲取到鎖。沒有建立成功節點,就會進行等待,當釋放鎖的時候,採用事件通知給客戶端重新獲取鎖資源。如果請求超時直接返回給客戶端超時,重新請求即可。
**實現
為了更好的展現效果,我這裡設定每個執行緒請求需要1s,請求超時時間為30s。
首先我們先寫乙個測試類,模擬多執行緒多客戶端請求的情況:
public class zklocktest implements runnable else catch (exception e) finally else catch (exception e) catch (exception e) else else catch (exception e) finally {
// 監聽完畢後,移除事件通知
zkclient.unsubscribedatachanges(lockpath, izkdatalistener);
return false;
這個類是我實現zk鎖的核心類,和上文原理圖中類似。首先使用者請求的時候需要獲取鎖,第乙個爭奪到鎖的使用者執行相關邏輯後釋放鎖,在這個過程中如果程式出錯斷開連線,因為臨時節點的緣故,節點也會自動刪除釋放鎖的。
另外就是其他爭奪鎖失敗的使用者,我這裡設定了一定的等待時間,當在時間內原鎖釋放,還是可以重新去獲取鎖的。這裡要說下鎖釋放的監聽,在原生的zookeeper中,使用watcher需要每次先註冊,而且使用一次就需要註冊一次。而在zkclient中,沒有註冊watcher的必要,而是引入了listener的概念,即只要client在某乙個節點中註冊了listener,只要服務端發生變化,就會通知當前註冊listener的客戶端。我這裡使用的是izkdatalistener,這個類是zkclient提供的乙個介面,它可以在當前節點資料內容或版本發生變化或者當前節點被刪除時觸發。
觸發後我們就可以重新去爭奪鎖,當再次爭奪失敗進入等待時會再次檢測當前請求是否超時。
下面我們來看下上述**的實現效果:
zk分布式鎖開始。。
####獲取鎖成功######
執行緒:thread-3,搶購成功:1544183770509
#######釋放鎖#########
####獲取鎖成功######
執行緒:thread-81,搶購成功:1544183771555
#######釋放鎖#########
超時返回
執行緒:thread-11,搶購超時失敗請重試:1544183800677
超時返回
執行緒:thread-1,搶購超時失敗請重試:1544183800681
#######釋放鎖#########
#######釋放鎖#########
####獲取鎖成功######
執行緒:thread-49,搶購成功:1544183801710
超時返回
執行緒:thread-25,搶購超時失敗請重試:1544183801729
超時返回
#######釋放鎖#########
#######釋放鎖#########
釋放鎖說的可能並不準確,應該說是關閉連線,有些執行緒實際上是沒有得到鎖的。
簡單嘗試了下zk實現分布式鎖的方式,當然上述**如果應用到生產中肯定問題還是不少的,因為興趣點不在這,就不仔細研究了。簡單來說,相比其他方式實現步驟更為複雜,感覺更容易出問題。
總結經過三種方式的應用和簡單實踐,總結實現分布式鎖三種方式的優缺點如下
1、資料庫實現:
優點,實現簡單只是for update的顯示加鎖。缺點,效能問題較大,而且本身系統在設計時是需要盡量減輕資料庫的壓力的。
2、redis實現:
優點:一般網際網路專案都會整合,本身是nosql資料庫,快取實現簡單,高併發應付自如,同時新版的jedis完美解決了以往程式出錯,未設定超時時間死鎖的問題。
缺點:網路問題可能會引起鎖刪除失敗,超時時間有一定的延遲。
3、zookeeper實現:
優點:zookeeper臨時節點先天可控的有效期設定,避免了程式引發的死鎖問題
缺點:實現過於繁雜,相比其他兩種寫法更容易出問題,另外還需要單獨維護zk。
結論:我個人更為推薦redis的實現方式,實現簡單,效能也比較好,同時引入集群可以提高可用性。jedis多參的設定方式也較好的保證了有效期的控制和死鎖的問題
簡單聊聊分布式鎖 zookeeper分布式鎖
zookeeper分布式鎖 zookeeper分布式鎖 舉個栗子。對某乙個資料連續發出兩個修改操作,兩台機器同時收到了請求,但是只能一台機器先執行完另外乙個機器再執行。那麼此時就可以使用 zookeeper 分布式鎖,乙個機器接收到了請求之後先獲取 zookeeper 上的一把分布式鎖,就是可以去建...
zookeeper分布式鎖
方案1 演算法思路 利用名稱唯一性,加鎖操作時,只需要所有客戶端一起建立 test lock節點,只有乙個建立成功,成功者獲得鎖。解鎖時,只需刪除 test lock節點,其餘客戶端再次進入競爭建立節點,直到所有客戶端都獲得鎖。特點 這種方案的正確性和可靠性是zookeeper機制保證的,實現簡單。...
zookeeper分布式鎖
zookeeper節點有4個型別 1.持久型 2.瞬時型 3.持久自動排序型 4.瞬時自動排序型 分布式鎖利用的就是zookeeper中瞬時自動排序型節點特性。一 瞬時自動排序節點 瞬時特點為,當客戶端斷開連線的時候,該節點自動消除。自動排序則為,如果節點名字重複,則自動在該節點名字後新增數字,該數...