基于ZooKeeper實現分布式鎖(Spring Boot接入)及與Kafka實現的對比分析

在分布式系統中,多節點對共享資源的并發訪問往往會引發數據一致性問題,分布式鎖正是解決這一問題的核心組件。本文將從原理出發,詳細講解基于ZooKeeper實現分布式鎖的完整流程,提供Spring Boot接入的可運行代碼,并深入對比其與Kafka實現分布式鎖的異同點及優缺點,幫助開發者根據業務場景做出合適選擇。

一、ZooKeeper分布式鎖的實現原理

ZooKeeper能實現分布式鎖,核心依賴其樹形節點結構Watcher監聽機制臨時順序節點特性,這三大特性共同保證了鎖的安全性、可用性和自動釋放能力。

1.1 核心特性依賴

  • 臨時節點(Ephemeral Node):客戶端與ZooKeeper集群建立的會話(Session)斷開時,臨時節點會被自動刪除。這一特性從根本上避免了“客戶端崩潰后鎖無法釋放”的死鎖問題——即使持有鎖的服務宕機,會話失效后鎖節點也會自動清理。
  • 順序節點(Sequential Node):當客戶端創建順序節點時,ZooKeeper會在節點名稱后自動追加一個全局唯一的遞增序號(如lock-0000000001lock-0000000002)。通過序號大小,可天然實現“排隊搶鎖”的邏輯,避免多個客戶端同時爭搶鎖。
  • Watcher監聽機制:客戶端可對指定節點注冊監聽,當節點發生“創建/刪除/數據修改”等事件時,ZooKeeper會主動通知客戶端。基于此,未搶到鎖的客戶端無需輪詢等待,只需監聽前一個順序節點的刪除事件,實現“按需喚醒”,減少資源浪費。

1.2 鎖的核心流程(公平鎖實現)

基于上述特性,ZooKeeper分布式鎖的實現遵循“創建節點→判斷排序→監聽等待→釋放鎖”的閉環流程,具體步驟如下:

  1. 初始化鎖節點:提前在ZooKeeper中創建一個持久化的根節點(如/distributed-lock),作為所有分布式鎖的父節點(持久化節點確保服務重啟后父節點不丟失)。
  2. 客戶端搶鎖:當客戶端需要獲取鎖時,在根節點下創建一個臨時順序子節點(如/distributed-lock/lock-),ZooKeeper會自動為其追加序號,最終節點名稱如/distributed-lock/lock-0000000003
  3. 判斷是否獲鎖:客戶端創建節點后,查詢根節點下所有的臨時順序子節點,并按序號從小到大排序。若當前客戶端創建的節點是序號最小的節點,則直接獲取鎖;若不是,則說明有其他客戶端正在持有鎖。
  4. 監聽前序節點:未獲鎖的客戶端,找到當前節點的“前一個序號節點”(如當前節點是lock-0000000003,則前序節點是lock-0000000002),并為前序節點注冊“節點刪除”的Watcher監聽。之后客戶端進入等待狀態,直到監聽到前序節點被刪除。
  5. 喚醒與重試:當持有鎖的客戶端釋放鎖(主動刪除自身節點或會話斷開導致節點自動刪除)時,前序節點被刪除,ZooKeeper會通知監聽該節點的客戶端。客戶端被喚醒后,重復步驟3(重新查詢所有子節點并判斷自身是否為最小節點),直至獲取鎖。
  6. 釋放鎖:客戶端完成業務邏輯后,主動刪除自身創建的臨時順序節點,釋放鎖;若客戶端宕機或會話超時,ZooKeeper會自動刪除節點,實現鎖的“被動釋放”。

二、Spring Boot接入ZooKeeper分布式鎖的完整代碼

在Spring Boot項目中,我們通常使用curator-framework(Apache Curator)作為ZooKeeper的客戶端框架——Curator已封裝了分布式鎖的核心邏輯(如InterProcessMutex類),避免重復造輪子,同時解決了原生ZooKeeper客戶端的“Watcher一次性觸發”“會話重連”等問題。

2.1 步驟1:引入依賴

pom.xml中添加Spring Boot Starter和Curator依賴(Curator需匹配ZooKeeper版本,此處以ZooKeeper 3.8.x為例):

<!-- Spring Boot基礎依賴 -->
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.10</version><relativePath/>
</parent><dependencies><!-- Spring Boot Web(用于模擬業務接口) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Curator(ZooKeeper客戶端框架,含分布式鎖實現) --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>5.4.0</version><!-- 排除自帶的ZooKeeper依賴,避免版本沖突 --><exclusions><exclusion><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId></exclusion></exclusions></dependency><!-- ZooKeeper客戶端核心依賴 --><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.8.1</version><!-- 解決ZooKeeper 3.8.x的SLF4J日志沖突 --><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion></exclusions></dependency><!-- 工具類依賴(用于日志和JSON處理) --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.20</version></dependency>
</dependencies>

2.2 步驟2:配置ZooKeeper客戶端

通過Spring Boot配置類,初始化Curator的CuratorFramework客戶端(單例模式,避免重復創建連接):

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ZkConfig {// 從配置文件讀取ZooKeeper集群地址(如127.0.0.1:2181,127.0.0.1:2182)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/95459.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/95459.shtml
英文地址,請注明出處:http://en.pswp.cn/web/95459.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Shell 三劍客之 awk 命令詳解(理論+實戰)

目錄 一、前言 二、工作流程總覽 三、最常用內置變量 四、命令格式 五、20 個高頻實戰案例 5.1 基礎打印 awk {print "hello"} < /etc/passwd 所有行打印成hello awk {print} test6.txt 打印test6.txt文件 awk {print $1} test6.txt 默認以空格為分割&am…

一個真正跨平臺可用的免費PDF解決方案

在整理資料時&#xff0c;常需將不同格式的文件統一轉為PDF格式&#xff0c;確保排版不亂、便于長期保存和打印 它的功能全面&#xff0c;支持批量操作&#xff0c;使用非常方便&#xff1a;只需把PDF文件拖進界面&#xff0c;選擇目標格式&#xff0c;無論PDF轉換成Word、PDF…

強化微調:以Swift框架進行GRPO多模態模型強化微調為例

一、TL&#xff1b;DR 整體介紹&#xff1a;強化微調RFT的原因、步驟、作用以及常見的rft方式dmeo舉例&#xff1a;以Swift給的Qwen2.5-Math-7B-Instruct為例介紹了整個RFT的流程和代碼細節實際強化微調&#xff1a;以qwen/internVL為例完成一次指令微調并且使用強化學習進一步…

時序數據:使用關系數據庫 vs 時序數據庫存儲的核心區別是什么?

一、時序數據使用關系數據庫 vs 時序數據庫存儲的核心區別 時序數據&#xff08;Time Series Data&#xff09;是指隨時間連續產生的數據&#xff08;如傳感器讀數、服務器指標、交易記錄等&#xff09;&#xff0c;其核心特點是高頻寫入、時間有序、量大且查詢模式集中于時間范…

ansible判斷

ansible判斷 一、判斷運算符 “” “!” “>” “<” “>” “<” “and” “or” “not” is in 每次執行完一個任務&#xff0c;不管成功與失敗&#xff0c;都會將執行的結果進行注冊&#xff0c;可以使用這個注冊的變量來判斷 when&#…

接口設計標準化流程,結合RESTful最佳實踐和實際開發經驗,涵蓋從需求分析到部署的全過程

目錄一、接口設計流程二、需求分析階段1. 功能需求2. 非功能性需求三、接口設計規范四、詳細實現步驟1. 選擇Web框架2. 接口路由設計3. 請求參數定義4. 請求參數驗證5. 業務邏輯分層6. 錯誤處理機制7. 異步任務處理8. 安全策略9. 接口文檔10. 測試策略11. 服務部署11.1 生產環境…

LeetCode 1023.駝峰式匹配

給你一個字符串數組 queries&#xff0c;和一個表示模式的字符串 pattern&#xff0c;請你返回一個布爾數組 answer 。只有在待查項 queries[i] 與模式串 pattern 匹配時&#xff0c; answer[i] 才為 true&#xff0c;否則為 false。 如果可以將 小寫字母 插入模式串 pattern 得…

【IQA技術專題】 無參考自然圖像IQA:NIQE

無參考自然圖像IQA&#xff1a;NIQE&#xff1a;Making a “Completely Blind” Image Quality Analyzer&#xff08;2012 IEEE&#xff09;專題介紹一、研究背景二、NIQE方法2.1 NSS model2.2 Patch Selection2.3 Characterizing Image Patches2.4 Multivariate Gaussian Mode…

變位齒輪:分度圓、節圓與中心距的 “特殊關聯”

接著上回的話題&#xff0c;在標準齒輪中&#xff0c;我們追求的是“節圓與分度圓重合”的理想狀態。但當實際工程提出更苛刻的要求時&#xff0c;比如&#xff1a;需要避免齒輪根切&#xff08;齒數過少時&#xff09;。要配湊一個非標準的中心距。需要大幅提高小齒輪的強度和…

Spring Boot集成Kafka常見業務場景最佳實踐實戰指南

一、基礎集成與核心組件解析 &#xff08;一&#xff09;環境搭建與依賴配置 在 Spring Boot 項目中集成 Kafka&#xff0c;首先需通過 Maven 添加核心依賴&#xff1a; <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>…

黑芝麻智能與云深處科技達成戰略合作,共推具身智能平臺全球市場應用

8月28日&#xff0c;智能汽車計算芯片引領者黑芝麻智能與具身智能創新技術與行業應用引領者云深處科技達成戰略合作。雙方將圍繞具身智能控制平臺開發、行業智能解決方案共建與國際市場拓展三大方向展開深度合作&#xff0c;攜手推進高性能機器人在多行業場景的規模化落地與應用…

AI零售創業公司:零眸智能

零眸智能公司分析 引言 “這次融資與合作&#xff0c;讓我們的全球化節奏更堅實也更有確定性。秉持‘讓熱愛與科技成就無限可能’&#xff0c;我們堅持真誠合作、長期主義與價值共享&#xff0c;把行業垂直AI能力按里程碑推進并沉淀為可復制的標準。” —— 零眸智能CEO樊凌云①…

學習插入排序+希爾排序并使用java寫代碼

目錄 插入排序 例子時間復雜度java代碼 希爾排序&#xff08;縮小增量排序&#xff09; 例子時間復雜度java代碼 相關文章 學習數據結構理論算法時間復雜度學習有序二叉樹平衡二叉樹紅黑樹學習冒泡排序選擇排序并使用java寫代碼學習插入排序希爾排序并使用java寫代碼學習堆…

win10虛擬機報錯打不開和ubuntu空間不足

ubuntu主機安裝的win10虛擬機報錯如下&#xff0c;導致虛擬機無法打開解決辦法 如上圖&#xff0c;找到ubuntu主機home目錄中win10的路徑&#xff0c;將紅色框的文件刪除&#xff0c;然后將綠色框中的文件.prev后綴去掉&#xff0c;如下圖所示。重新打開虛擬機就可以了 ubuntu空…

指紋手機技術:破解亞馬遜多賬號運營痛點的底層邏輯與實踐

在亞馬遜平臺運營中&#xff0c;賬號關聯、行為異常、網絡不合規是賣家繞不開的三大核心風險。隨著亞馬遜反作弊系統&#xff08;如 A9 算法&#xff09;對設備指紋、操作軌跡、網絡特征的識別精度持續提升&#xff0c;傳統 “普通手機 VPN” 的多賬號運營模式已頻繁觸發風控&…

《UE5_C++多人TPS完整教程》學習筆記46 ——《P47 蹲伏行走(Crouching Walking)》

本文為B站系列教學視頻 《UE5_C多人TPS完整教程》 —— 《P47 蹲伏行走&#xff08;Crouching Walking&#xff09;》 的學習筆記&#xff0c;該系列教學視頻為計算機工程師、程序員、游戲開發者、作家&#xff08;Engineer, Programmer, Game Developer, Author&#xff09; S…

TiDB v8.5.3 單機集群部署指南

前言 最近在做 TiDB 的恢復演練&#xff0c;需要在單臺 Linux 服務器上部署一套 TiDB 最小的完整拓撲的集群&#xff0c;本文記錄一下安裝過程。 環境準備 開始部署 TiDB 集群前&#xff0c;準備一臺部署主機&#xff0c;確保其軟件滿足需求&#xff1a; 推薦安裝 CentOS 7…

ClickHouse常見問題——ClickHouseKeeper配置listen_host后不生效

ClickHouseKeeper配置listen_host后不生效ClickHouseKeeper配置listen_host后不生效ClickHouseKeeper配置listen_host后不生效 3節點部署ClickHouse集群后&#xff0c;ClickHouse Server執行報錯&#xff1a; Poco::Exception. Code: 1000, e.code() 111, Connection refuse…

《Python × MongoDB 實戰指南:從連接到查詢,構建高效數據操作流程》

《Python MongoDB 實戰指南:從連接到查詢,構建高效數據操作流程》 一、引言:當 Python 遇上 MongoDB 在當今數據驅動的開發世界里,MongoDB 以其靈活的文檔結構、強大的查詢能力和良好的擴展性,成為 NoSQL 數據庫中的佼佼者。而 Python,作為一門簡潔優雅、生態豐富的編…

【Flask + Vue3 前后端分離管理系統】

Flask Vue3 前后端分離管理系統 項目概述 本項目是一個基于 Flask 后端和 Vue3 前端的前后端分離管理系統。項目實現了用戶管理、角色管理、菜單管理、權限控制等完整的后臺管理功能。 技術棧 后端技術棧&#xff1a; Flask 3.0.0 - Python Web框架Flask-SQLAlchemy 3.1.1 - O…