91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Zookeeper如何實現分布式鎖

發布時間:2022-01-25 10:07:32 來源:億速云 閱讀:156 作者:iii 欄目:開發技術

這篇“Zookeeper如何實現分布式鎖”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Zookeeper如何實現分布式鎖”文章吧。

Zookeeper如何實現分布式鎖

排他鎖

排他鎖(Exclusive Locks),又被稱為寫鎖或獨占鎖,如果事務T1對數據對象O1加上排他鎖,那么整個加鎖期間,只允許事務T1對O1進行讀取和更新操作,其他任何事務都不能進行讀或寫。

定義鎖:

/exclusive_lock/lock

實現方式:

利用 zookeeper 的同級節點的唯一性特性,在需要獲取排他鎖時,所有的客戶端試圖通過調用 create() 接口,在 /exclusive_lock 節點下創建臨時子節點 /exclusive_lock/lock,最終只有一個客戶端能創建成功,那么此客戶端就獲得了分布式鎖。同時,所有沒有獲取到鎖的客戶端可以在 /exclusive_lock 節點上注冊一個子節點變更的 watcher 監聽事件,以便重新爭取獲得鎖。

共享鎖

共享鎖(Shared Locks),又稱讀鎖。如果事務T1對數據對象O1加上了共享鎖,那么當前事務只能對O1進行讀取操作,其他事務也只能對這個數據對象加共享鎖,直到該數據對象上的所有共享鎖都釋放。

定義鎖:

/shared_lock/[hostname]-請求類型W/R-序號

實現方式: 1、客戶端調用 create 方法創建類似定義鎖方式的臨時順序節點。 Zookeeper如何實現分布式鎖

2、客戶端調用 getChildren 接口來獲取所有已創建的子節點列表。

3、判斷是否獲得鎖,對于讀請求如果所有比自己小的子節點都是讀請求或者沒有比自己序號小的子節點,表明已經成功獲取共享鎖,同時開始執行度邏輯。對于寫請求,如果自己不是序號最小的子節點,那么就進入等待。

4、如果沒有獲取到共享鎖,讀請求向比自己序號小的最后一個寫請求節點注冊 watcher 監聽,寫請求向比自己序號小的最后一個節點注冊watcher 監聽。

實際開發過程中,可以 curator 工具包封裝的API幫助我們實現分布式鎖。

 org.apache.curator
 curator-recipes
 x.x.x

curator 的幾種鎖方案 :

  1. InterProcessMutex:分布式可重入排它鎖
  2. InterProcessSemaphoreMutex:分布式排它鎖
  3. InterProcessReadWriteLock:分布式讀寫鎖

下面例子模擬 50 個線程使用重入排它鎖 InterProcessMutex 同時爭搶鎖:

實例

public class InterprocessLock {
   public static void main(String[] args)  {
       CuratorFramework zkClient = getZkClient();
       String lockPath = "/lock";
       InterProcessMutex lock = new InterProcessMutex(zkClient, lockPath);
       //模擬50個線程搶鎖
       for (int i = 0; i run() {
           try {
               lock.acquire();
               System.out.println("第"+threadFlag+"線程獲取到了鎖");
               //等到1秒后釋放鎖
               Thread.sleep(1000);
           } catch (Exception e) {
               e.printStackTrace();
           }finally {
               try {
                   lock.release();
               } catch (Exception e) {
                   e.printStackTrace();
               }
           }
       }
   }

   private static CuratorFramework getZkClient() {
       String zkServerAddress = "192.168.3.39:2181";
       ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000, 3, 5000);
       CuratorFramework zkClient = CuratorFrameworkFactory.builder()
               .connectString(zkServerAddress)
               .sessionTimeoutMs(5000)
               .connectionTimeoutMs(5000)
               .retryPolicy(retryPolicy)
               .build();
       zkClient.start();
       return zkClient;
   }
}

控制臺每間隔一秒鐘輸出一條記錄: Zookeeper如何實現分布式鎖

以上就是關于“Zookeeper如何實現分布式鎖”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鸡泽县| 永德县| 蛟河市| 台北市| 景德镇市| 盐津县| 定日县| 林芝县| 纳雍县| 微山县| 东至县| 原平市| 玉门市| 九寨沟县| 鹤峰县| 隆化县| 磐安县| 巴楚县| 顺义区| 潮安县| 石楼县| 沾化县| 雅江县| 邵东县| 黔江区| 娱乐| 泊头市| 大同县| 北票市| 临安市| 铁岭市| 敖汉旗| 中卫市| 轮台县| 楚雄市| 龙游县| 岳普湖县| 凤阳县| 略阳县| 华容县| 泰安市|