首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Apache Curator 實作 ZooKeeper 分散式鎖(InterProcessMutex)完整教學

     編輯:Java 相關知識

前言

在分散式系統中,協調多節點對共享資源的互斥存取是核心課題。Apache Curator 是 ZooKeeper 的高階客戶端框架,提供 InterProcessMutex 實現可重入的分散式鎖,自動處理連線重試、Session 過期、羊群效應等複雜情境。本文以完整可執行範例示範基本用法。

Maven 依賴

<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>5.6.0</version>
</dependency>
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>5.6.0</version>
</dependency>

核心程式碼解析

import java.util.concurrent.*;
import com.netflix.curator.*;
import com.netflix.curator.framework.*;
import com.netflix.curator.framework.recipes.locks.*;
import com.netflix.curator.retry.*;

public class CuratorLockDemo {
    private static final String ZK_CONNECTION = "localhost:2181";
    private static final String LOCK_PATH = "/shared_lock/demo";

    public static void main(String[] args) throws Exception {
        // 1. 建立客戶端,指數退避重試
        RetryPolicy retry = new ExponentialBackoffRetry(1000, 3);
        CuratorFramework client = CuratorFrameworkFactory.newClient(ZK_CONNECTION, retry);
        client.start();
        System.out.println("ZooKeeper 客戶端已啟動");

        // 2. 模擬 5 個客戶端搶鎖
        ExecutorService executor = Executors.newFixedThreadPool(5);
        CountDownLatch latch = new CountDownLatch(5);

        for (int i = 0; i < 5; i++) {
            final String clientName = "Client-" + i;
            executor.submit(() -> {
                InterProcessMutex lock = new InterProcessMutex(client, LOCK_PATH);
                try {
                    if (lock.acquire(30, TimeUnit.SECONDS)) {
                        try {
                            System.out.println("[" + clientName + "] 獲得鎖,開始處理業務");
                            Thread.sleep(2000); // 模擬業務處理
                            System.out.println("[" + clientName + "] 業務完成");
                        } finally {
                            lock.release();
                            System.out.println("[" + clientName + "] 釋放鎖");
                        }
                    } else {
                        System.out.println("[" + clientName + "] 獲取鎖超時");
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    latch.countDown();
                }
            });
        }

        latch.await(); // 等待所有任務結束
        executor.shutdown();
        client.close();
        System.out.println("示範結束");
    }
}

關鍵類別說明

類別用途
ExponentialBackoffRetry連線失敗時指數退避重試策略
InterProcessMutex可重入分散式鎖,基於 ZooKeeper 臨時有序節點
acquire(timeout, unit)阻塞等待鎖,支援超時控制
release()釋放鎖,必須在 finally 區塊呼叫

進階主題

  • 鎖的公平性:Curator 使用有序節點,天然保證 FIFO 公平鎖。
  • 可重入性:同一執行緒多次 acquire 需對應次數 release。
  • Session 過期處理:Curator 內建 ConnectionStateListener,Session 失效時自動釋放鎖並拋出例外。
  • 讀寫鎖:若需讀寫分離,可改用 InterProcessReadWriteLock。

常見坑點提醒

  1. 鎖路徑 LOCK_PATH 必須所有參與者共享相同路徑。
  2. 務必在 finally 釋放鎖,否則造成死鎖。
  3. ZooKeeper 集群建議 3/5 節點,單點測試僅供開發驗證。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved