1. 程式人生 > >zookeeper應用之分散式鎖Java實現

zookeeper應用之分散式鎖Java實現

原文地址:http://blog.csdn.net/z69183787/article/details/79355829

zookeeper在專案中有很多應用,其中一個比較常見的的就是分散式鎖,zookeeper實現分散式鎖的原理是根據zookeeper建立的臨時有序節點,每次zookeeper在同一個目錄下建立的臨時有序節點是有序的,會自動累加,如果本次操作建立的節點在目錄內是最小節點,則獲得鎖,否則阻塞等待鎖,並且總是在前一個節點上註冊watcher監視前一個節點的釋放,較小的節點釋放後,等待的節點對應的操作獲得鎖,以此類推,程式碼簡單實現如下:

public class ZKDisLock {private
 static final Logger SERVICE_LOG = LoggerFactory.getLogger(LogConstants.SERVICE_LOG);
//鎖目錄private static final String BASE_PATH = "/disLock";private static final String SPLIT_FLAG = "_";private Integer sessionOut;private String zkHost;private ZooKeeper zooKeeper;//當前鎖節點名稱private String lockNode;//等待鎖節點名稱private
 String waitNode;
private CountDownLatch countDownLatch;public ZKDisLock(Integer sessionOut, String zkHost) {this.sessionOut = sessionOut;this.zkHost = zkHost;}//ZKDisLock初始化public void init() throws DisLockException {try {zooKeeper = new ZooKeeper(zkHost, sessionOut, new Watcher() {@Overridepublic void
 process(WatchedEvent watchedEvent) {
}});//判斷有無根目錄,沒有的話建立Stat stat = zooKeeper.exists(BASE_PATH, false);if (stat == null) {zooKeeper.create(BASE_PATH, null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);}catch (Exception e) {SERVICE_LOG.info("zk初始化失敗");throw new DisLockException("zk初始化失敗");}}//加鎖public void lock(String content) throws DisLockException {if (zooKeeper == null) {throw new DisLockException("zk未初始化");}try {//建立節點String itemName = zooKeeper.create(BASE_PATH + "/" + content + SPLIT_FLAG, null,                                               ZooDefs.Ids.OPEN_ACL_UNSAFE,                                                CreateMode.EPHEMERAL_SEQUENTIAL);//判斷節點是否是目錄中同一個content的最小節點if (isLowestNode(content, itemName)) {SERVICE_LOG.info("執行緒:" + Thread.currentThread().getId() + ",加鎖成功,節點名稱:" + lockNode);return;else {SERVICE_LOG.info("執行緒:" + Thread.currentThread().getId() + ",等待鎖:" + waitNode);//不是最小節點,等待鎖釋放waitForLock(sessionOut);//鎖釋放後,再次判斷下是否是最小節點if (isLowestNode(content, itemName)) {SERVICE_LOG.info("執行緒:" + Thread.currentThread().getId() + ",獲得鎖,節點名稱:" + lockNode);return;}}catch (Exception e) {SERVICE_LOG.error("加鎖異常");throw new DisLockException("加鎖異常");}

相關推薦

zookeeper應用分散式Java實現

原文地址:http://blog.csdn.net/z69183787/article/details/79355829zookeeper在專案中有很多應用,其中一個比較常見的的就是分散式鎖,zookeeper實現分散式鎖的原理是根據zookeeper建立的臨時有序節點,每次

zookeeper應用分散式

  前一段時間有討論過用redis來實現分散式鎖,講到setNx不是原子性、redis新的set方法及其誤刪和守護執行緒,還為了原子性不得不使用redis的指令碼。雖然最終分散式鎖的這個效果是實現了,但是,不夠優雅。這裡討論一下zookeeper對分散式鎖的實現。   首先說一下z

zookeeper典型應用分散式

1.概念描述 1.分散式鎖:這個主要得益於zookeeper保證了資料的強一致性; 2.鎖服務分為兩:一個是保持獨佔,另外一個是控制時序; 2.保持獨佔 1.保持獨佔,就是所有檢視來獲取這個鎖的客戶端,最終只有一個可以成功獲得這把鎖; 2.通常的做法是把zk上的一個znode看

Redis分散式Java實現

Redis分散式鎖Java實現類   package com.utils; import java.util.Collections; import java.util.UUID; import redis.clients.jedis.Jedis; public cla

ZooKeeper應用場景-分散式設計

分散式鎖,這個主要得益於ZooKeeper為我們保證了資料的強一致性。鎖服務可以分為兩類,一個是保持獨佔,另一個是控制時序。 所謂保持獨佔,就是所有試圖來獲取這個鎖的客戶端,最終只有一個可以成功獲得這把鎖。通常的做法是把zk上的一個znode看作是一把鎖,通過create

redis分散式java實現解決快取雪崩

快取雪崩:因為快取失效(key生存時間到期)導致所有請求都去查詢資料庫,導致資料庫CPU和記憶體負載過高導致宕機。 快取雪崩原因及解決方案: 使用快取主要解決資料同步,並減少對資料庫訪問次數。因此,

Redis系列-生產應用篇-分散式(5)-單程序Redis分散式Java實現(Redisson使用與底層實現)-原子

Redisson單程序Redis分散式樂觀鎖的使用與實現 本文基於Redisson 3.7.5 4. 原子鎖類 Redisson中實現了兩種原子鎖類:RAtomicLong和RAtomicDouble,還有RLongAdder和RDoubleAdder RA

Zookeeper分散式簡單實現(JAVA)

近段時間嘗試用視覺化介面把zookeeper的資料整合到公司的後臺系統中展示,進而查閱了資料研究zookeeper的使用,於是看著看著就手癢想用它的API實現一個簡單的分散式鎖. 本程式實現的分散式鎖適用於叢集單點故障,leader選舉等場景 下

分散式redis實現

分散式鎖有幾種常用的實現方式:zookeeper、memcached、redis、mysql。這裡介紹一下redis的實現方式,並在最後附上了一個Demo小工具: 眾所周知,reids鎖是通過setnx + expire的方式實現的,setnx保證只有在key不存在時才能se

七張圖徹底講清楚ZooKeeper分散式實現原理【石杉的架構筆記】

歡迎關注個人公眾號:石杉的架構筆記(ID:shishan100) 週一至週五早8點半!精品技術文章準時送上! 一、寫在前面 之前寫過一篇文章(《拜託,面試請不要再問我Redis分散式鎖的實現原理》),給大家說了一下Redisson這個開源框架是如何實現Redis分散式鎖原理的,這篇文章再給大家聊一下ZooKe

Java架構-拜託,面試請不要再問我Redis分散式實現原理

一、寫在前面 現在面試,一般都會聊聊分散式系統這塊的東西。通常面試官都會從服務框架(Spring Cloud、Dubbo)聊起,一路聊到分散式事務、分散式鎖、ZooKeeper等知識。 所以咱們這篇文章就來聊聊分散式鎖這塊知識,具體的來看看Redis分散式鎖的實現原理。 說實

zooKeeper分散式實現原理

ZooKeeper分散式鎖機制 接下來我們一起來看看,多客戶端獲取及釋放zk分散式鎖的整個流程及背後的原理。 首先大家看看下面的圖,如果現在有兩個客戶端一起要爭搶zk上的一把分散式鎖,會是個什麼場景? 如果大家對zk還不太瞭解的話,建議先自行百度一下,簡單瞭解點基本概念,比

Redis實現分散式(spring定時任務叢集應用Redis分散式

         之前2片文章介紹了 描述:              不管用不用動態執行,單機服務都是沒有問題的,但是如果服務是叢集模式下,那麼一個任務在每臺機器都會執行一次,這肯定不是我們需要的,我們要實現的是整個叢集每次只有一個任務執行成功,但是spring

java分散式實現方式

原文出自:https://blog.csdn.net/seesun2012 ### 什麼是鎖? 在單程序的系統中,當存在多個執行緒可以同時改變某個變數(可變共享變數)時,就需要對變數或程式碼塊做同步,使其在修改這種變數時能夠線性執行消除併發修改變數。 而同步的本質是通過

zookeeper分散式程式碼實現(一)

利用zookeeper的臨時節點實現分散式鎖,這種方法簡單,斷開連線後能自動刪除臨時節點,相當於已獲得鎖的呼叫者掛掉後自動釋放鎖,但當呼叫者太多,會出現“驚群”現象。 /** * zookeeper鎖實現 * @author skymr * */ public cl

Redis分散式實現

點贊再看,養成習慣,微信搜尋【三太子敖丙】關注這個網際網路苟且偷生的工具人。 本文 GitHub https://github.com/JavaFamily 已收錄,有一線大廠面試完整考點、資料以及我的系列文章。 前言 上一章節我提到了基於zk分散式鎖的實現,這章節就來說一下基於Redis的分散式鎖實

排序算法入門選擇排序-Java實現

ati min .net 入門 oid 下標 static ava 對象數組 本文參考http://blog.csdn.net/m0_37568091/article/details/78023705 選擇排序是先從對象數組中選出最小的放在第一個位置,再從剩下的元素中選

ActiveMQ SSL應用四 編寫Java Demo類使用SSL連線ActiveMQ

一、主要內容 在Eclipse平臺編寫Java Demo類使用SSL連線ActiveMQ,並進行簡單的報文傳送,接收,並使用wireshark抓包工具對報文進行抓取分析。 二、Demo類 1、訊息生產者 package example; import javax.jms.C

分散式學習筆記四:分散式實現方式

目前幾乎很多大型網站及應用都是分散式部署的,分散式場景中的資料一致性問題一直是一個比較重要的話題。分散式的CAP理論告訴我們“任何一個分散式系統都無法同時滿足一致性(Consistency)、可用性(Availability)和分割槽容錯性(Partition tolerance),最多隻能同時滿足

ZooKeeper應用——解決分散式系統單點故障

1.單點故障問題 什麼是分散式系統中的單點故障:通常分散式系統採用主從模式,就是一個主控機連線多個處理節點。主節點負責分發任務,從節點負責處理任務,當我們的主節點發生故障時,那麼整個系統就都癱瘓了,那麼我們把這種故障叫作單點故障。 傳統方式是採用一個備用節點,這個備用節點定期給當前主節點發送