年底裸辞准备面试,我用7张图画了ZK分布式锁!

2023-11-18

一、写在前面

之前写过一篇文章:《都2022年了,出去面试连分布式锁的源码你都不会画?》,给大家说了一下Redisson这个开源框架是如何实现Redis分布式锁原理的,这篇文章再给大家聊一下ZooKeeper实现分布式锁的原理。

同理,我是直接基于比较常用的Curator这个开源框架,聊一下这个框架对ZooKeeper(以下简称zk)分布式锁的实现。

一般除了大公司是自行封装分布式锁框架之外,建议大家用这些开源框架封装好的分布式锁实现,这是一个比较快捷省事儿的方式。


二、ZooKeeper分布式锁机制

接下来我们一起来看看,多客户端获取及释放zk分布式锁的整个流程及背后的原理。

首先大家看看下面的图,如果现在有两个客户端一起要争抢zk上的一把分布式锁,会是个什么场景?

在这里插入图片描述

如果大家对zk还不太了解,建议先百度一下,快速了解一些基本概念,比如zk有哪些节点类型等等。

参见上图。zk里有一把锁,这个锁就是zk上的一个节点。然后呢,两个客户端都要来获取这个锁,具体是怎么来获取呢?

咱们就假设客户端A抢先一步,对zk发起了加分布式锁的请求,这个加锁请求是用到了zk中的一个特殊的概念,叫做“临时顺序节点”。

简单来说,就是直接在"my_lock"这个锁节点下,创建一个顺序节点,这个顺序节点有zk内部自行维护的一个节点序号。

比如说,第一个客户端来搞一个顺序节点,zk内部会给起个名字叫做:xxx-000001。然后第二个客户端来搞一个顺序节点,zk可能会起个名字叫做:xxx-000002。大家注意一下,最后一个数字都是依次递增的,从1开始逐次递增。zk会维护这个顺序。

所以这个时候,假如说客户端A先发起请求,就会搞出来一个顺序节点,大家看

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

年底裸辞准备面试,我用7张图画了ZK分布式锁! 的相关文章

  • 从文件中读取文本并将每行中的每个单词存储到单独的变量中

    我有一个包含以下内容的 txt 文件 1 1111 47 2 2222 92 3 3333 81 我想逐行读取并将每个单词存储到不同的变量中 例如 当我读取第一行 1 1111 47 时 我想将第一个单词 1 存储到var 1 1111 进
  • 如何获取JavaFX的版本号?

    如何在运行时找出我正在使用哪个版本的 JavaFX 简单的方法之一就是简单地阅读javafx properties文件位于您的 JAVA HOME jre lib目录 我现在安装了 Java 1 7 u9 与之捆绑的 JavaFX 是 v2
  • Appengine - 隐藏文件夹的部署

    为了验证 SSL 证书 我需要将包含一些文件的隐藏文件夹 well known 上传到我的应用程序 我正在使用 eclipse 部署 java 应用程序 但 appengine 上的应用程序未收到这些文件 我猜他们被过滤掉了 我尝试将隐藏文
  • 是否可以将 BitmapDescriptor 转换为 Bitmap?

    我需要将 BitmapDescriptor 转换为 Bitmap 我可以使用以下代码将位图转换为 BitmapDescriptor BitmapDescriptor bd BitmapDescriptorFactory fromBitmap
  • 要导入什么才能使用@SuppressFBWarnings?

    要使用 SuppressFBWarnings 需要导入什么 我通过帮助 安装新软件安装了 findbugs 插件 当我输入 import edu 时 我无法按 ctrl space 来获取选项 Example try String t nu
  • 如何在 TestNG 报告中包含 Log4j2 消息

    我希望在所有测试用例的 TestNG 报告中提供 Log4j2 日志记录信息 TestNG 使用一个名为 Reporter java 的特殊记录器类来跟踪日志输出并将其保存在其结果 XML 中 在 log4j 中 可以简单地创建一个路由到
  • 使用 IntelliJ 调试 Java 进程 - 连接到套接字但不连接到目标 VM

    现在已解决 请参阅问题末尾 我正在尝试使用 IntelliJ Community Edition 的调试器来调试 Java 进程 套接字正在侦听 但是当我尝试连接时 调试过程显示以下内容 连接到目标虚拟机 地址 8003 传输 socket
  • java - IBM-IEEE 双精度浮点字节转换

    我需要在 Java 中对字节数组进行 IBM IEEE 浮点转换 我能够使用成功地进行单精度浮点字节的转换http www thecodingforums com threads c code for converting ibm 370
  • 结果显示图像上有衬里

    我正在使用 opencv 和 android ndk 下面是我的 jni 代码 void Vignete Mat img1 Mat img2 Mat out resize img1 img1 img2 size img1 convertTo
  • Java 线程 JavaDoc

    我编写了一个只能在特定线程上调用的方法 是否应该将标准注释或注释添加到方法的 javadoc 中来表示这一点 不知道有任何这样的标准注释 Java 并发实践 http www javaconcurrencyinpractice com 在第
  • android 中的 lang.NumberFormatException

    我有以下代码 除了在后台线程中从数据库读取一些值并使用这些值之外什么也不做 我使用 jar 绘制折线图 对于我用于每个数组值的折线图 问题是第三个我传递给绘制 LineChart 的构造函数的参数是 float float viteza S
  • Java 性能:在 Java 机器控制中如何查找特定方法调用的堆大小、时间范围和内存统计信息

    使用 Java Mission Control 我们可以找到特定方法调用的堆大小 时间范围和内存统计信息 在方法分析部分 我无法弄清楚那些 要查找堆大小 您可以使用totalMemory and maxMemory Runtime 类的方法
  • 参数列表中的“...”是什么意思? doInBackground(字符串...参数)

    我不明白那个语法 尝试用谷歌搜索各种单词加上 是没有用的 它被称为varargs http java sun com j2se 1 5 0 docs guide language varargs html 这个事实应该产生更好的谷歌结果 h
  • 通过命令行参数更改默认的 ant 目标

    最近我被分配了一个任务 让ant能够为不同的环境构建war包 除了一项功能外 我几乎完成了 蚂蚁接受一个env参数类似 Denv DEV 并使用不同的配置文件来制作war包 但默认目标是start它将构建 部署并启动 tomcat 我不希望
  • ElasticSearch - 定义自定义字母顺序进行排序

    我正在使用 ElasticSearch 2 4 2 通过 Java 的 HibernateSearch 5 7 1 Final 我在字符串排序方面遇到问题 我的应用程序的语言有变音符号 它们有特定的字母顺序 订购 例如 直接在之后L 追随O
  • java.lang.Object#getClass() 的 Eclipse 外部空注释

    我正在使用 Eclipse Mars 中提供的外部空注释工具 我正在尝试添加外部注释java lang Object getClass 但似乎无法正确签名 我尝试过以下变体 NonNull Class getClass L1java lan
  • 术语“可序列化”是什么意思? [复制]

    这个问题在这里已经有答案了 不太确定我读过的定义可序列化实际上做了什么 import java io Serializable import java text StringCharacterIterator import java uti
  • 如何为信号量中等待的线程提供优先级?

    我使用信号量来限制访问函数的线程数量 我希望接下来要唤醒的线程应该由我将给出的某个优先级选择 而不是默认信号量唤醒它们的方式 我们怎样才能做到这一点 这是实现 class MyMathUtil2 implements Runnable do
  • 来自 Janino 和 Commons-Compiler 的 Spark java.lang.NoSuchMethodError

    我正在构建一个使用 Spark 进行基于随机森林分类的 应用程序 当尝试运行该程序时 我从该行收到异常 StringIndexerModel labelIndexer new StringIndexer setInputCol label
  • Java中精确的时间测量

    Java 提供了两种获取当前时间的方法 System nanoTime and System currentTimeMillis 第一个给出的结果以纳秒为单位 但实际精度比这要差得多 许多微秒 JVM 是否已经为每台特定机器提供了最佳的价值

随机推荐

  • Puzzles【Codeforces 697 D】【树形DP + 期望DP】

    Codeforces Round 362 Div 2 D 我们从1号结点开始 给每个结点标序 问的是每个结点的序号的期望是多少 输出这N个结点的期望 那么1号点的期望一定就是1了 对于其他的点呢 可以举例这样的一幅图 首先我们可以确定1 因
  • 基于UDP编程

    基于UDP编程 1 UDP是数据报协议 无连接的 不可靠 追求传输效率的一种通信协议数据的发送和接收是同步的 在进行通信之前 不需要建立连接 其传输效率比TCP高 对其服务器而言 并没有三次握手的过程 因此和TCP相比 少了被动监听 lis
  • Springboot实现发送邮件功能

    相信使用过Spring的众多开发者都知道Spring提供了非常好用的JavaMailSender接口实现邮件发送 在Spring Boot的Starter模块中也为此提供了自动化配置 下面通过实例来讲解如何在Spring Boot中使用Ja
  • 发布自己的Python包(Pypi)

    发布自己的Python包 Pypi 我们经常使用 Pypi 来安装包 但是有时候我们也想要发布自己的 Pypi 包 有可能我们写了一个特别牛的包 也有可能我们只是想使用自己常用的一些轮子 可能这是我们日常编码中很常用的一些轮子 我们在不同工
  • AttributeError: 'list' object has no attribute 'shape'

    深思熟虑 运筹帷幄 疑惑 解惑 shape 是数组的属性 不是集合的属性 可把集合变成数组 如np array list A
  • 架构之道:分离业务逻辑和技术细节

    点击上方 朱小厮的博客 选择 设为星标 当当满200减40优惠码 J2KNAE 来源 阿里巴巴云原生 1 什么是架构 关于架构这个概念很难给出一个明确的定义 也没有一个标准的定义 硬是要给一个概述 我认为架构就是对系统中的实体以及实体之间的
  • [深度学习] - 网络模型训练过程的 loss 变化分析 (loss / val_loss / test_loss)

    目录 一 train set 和 test set 基础知识 二 分析 loss 和 val loss test loss 变化情况 一 train set 和 test set 基础知识 train set 训练集是用来训练网络模型的数据
  • 大数据主要应用于哪些行业,应用价值是什么?

    大数据无处不在 大数据应用于各个行业 包括金融 汽车 餐饮 电信 能源 体能和娱乐等在内的社会各行各业都已经融入了大数据的印迹 下面详细介绍一下大数据在各行各业的具体应用 制造业 利用工业大数据提升制造业水平 包括产品故障诊断与预测 分析工
  • - UnitBox An Advanced Object Detection Network,arxiv 16.08

    UnitBox An Advanced Object Detection Network arxiv 16 08 download 该论文提出了一种新的loss function IoU loss 这点比较有意思 也容易复现 论文分析了fa
  • Python之子类调用父类的两种方式

    第一种方式 直接在子类中调用父类名 调用方式如下 Vehicle init self name speed load power 调用父类的实例 Vehicle run self 调用父类的方法 下面给出具体样例 直接调用父类名 class
  • Tesseract-OCR4.0在Visual Studio2015中的编译及运行

    最近项目需要使用到OCR引擎 通过百度了解到Tesseract在这方面做的挺好的 于是便开始学习tesseract tesseract的github地址 https github com tesseract ocr tesseract 现在
  • 四种排序:选择,插入,冒泡,快速排序原理及其对应的时间、空间复杂度解析

    四种排序 选择 插入 冒泡 快速排序原理及其对应的时间空间复杂度 首先 在了解四种排序之前 让我们来了解一下什么是时间复杂度和空间复杂度 时间复杂度 算法的时间复杂度是一个函数 它定性描述该算法的运行时间 记做T n 直白的来说 就是指运行
  • SDIO 驱动

    原文地址 http blog csdn net fengyuyaoye1980 article details 6859343 SDIO卡 SDIO卡是在SD内存卡接口的基础上发展起来的接口 SDIO接口兼容以前的SD内存卡 并且可以连接S
  • 期货开户的时间和流程

    对于一些想要做期货投资的朋友来说 最基本的就是首先要进行期货开户 那就需要了解开户具体的流程和相关注意事项 一般来说了解清楚一下三点就没什么问题了 一 对开户者本人的要求 1 年满18周岁 2 中国公民 有中国公民身份证 境内储蓄卡 3 没
  • pywinauto和PyUserInput实现windows程序自动化

    一 pywinauto 官方文档 https pywinauto readthedocs io en latest code code html 首先需要下个spy lite 便于查看程序窗口属性 主要模块 pywinauto applic
  • 通过jdbc实现GBase 8s Row类型数据插入与查询

    Row数据类型 由一个或多个任意的数据类型组成 例如 创建一个r1 t的Row数据类型 具有integer类型的i和boolean类型的b字段 参考语句如下 CREATE ROW TYPE r1 t i int b boolean 本文章详
  • Flutter:bottomNavigationBar图标白色的解决办法

    Flutter中 如果底部的Item超过三个 我们就需要为BottomNavigationBar设置一个type属性为 BottomNavigationBarType fixed 否则图标就会变成白色 导致什么都看不见
  • 设计模式之【观察者模式】

    观察者模式动机与定义 模式动机 一个对象的状态改变会引起其他对象的状态改变 模式定义 观察者模式 Observer Pattern 定义 定义对象间一种一对多的依赖关系 使得每当一个对象状态发生改变时 其相关依赖对象皆得到通知并被自动更新
  • few-shot learning, zero-shot learning, one-shot learning,any-shot learning, C-way K-shot,Meta-learn

    更新 2021 7 6 元学习 meta learning 与机器学习 machine learning machie learning 通常是单任务学习 每个任务有训练集和测试集 在训练集上训练模型 在测试集上测试模型 meta lear
  • 年底裸辞准备面试,我用7张图画了ZK分布式锁!

    一 写在前面 之前写过一篇文章 都2022年了 出去面试连分布式锁的源码你都不会画 给大家说了一下Redisson这个开源框架是如何实现Redis分布式锁原理的 这篇文章再给大家聊一下ZooKeeper实现分布式锁的原理 同理 我是直接基于