互联网技术 / 互联网资讯 · 2024年1月18日

Curator源码解析:ZooKeeper分布式可重入锁

前言

一般工作中常用的分布式锁,就是基于 Redis 和 Zookeeper,前面已经介绍完了 Redisson 锁相关的源码,下面一起看看基于 Zookeeper 的锁。也就是 Curator 这个框架。

Curator 的锁也分为很多种,本文分析共享可重入锁。

考虑到如果文章篇幅较长,不太适合阅读,所以对文章做了适当的拆分。

环境配置

本机三个节点

版本:3.7.0 系统:MacOS 安装方式:Brew install zookeeper Curator Maven 依赖版本:5.1.0

Org.Apache.Curator Curator-Recipes 5.1.0

加锁示例

详细信息可参考官方文档。

加锁前

在加锁之前,Zookeeper 仅有一个节点 /zookeeper。

加锁中

在 /locks/lock_01 路径上加锁。

加锁之后:

创建了一个 /locks/lock_01 的持久节点,节点下有一个子节点 _c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000 节点 /locks/lock_01/_c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000 是临时节点 节点 /locks/lock_01/_c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000 的数据是机器 IP 地址

加锁源码

PS:下面代码截图中的代码风格就是 Curator 源码的代码风格。

入口

InterProcessMutex#internalLock

开始先从 ThreadData 中获取当前线程,这里肯定是没有的,所以进入 attemptLock 方法。

本方法中还包含了锁重入的逻辑,后面也会介绍。

加锁

LockInternals#attemptLock

核心部分就是这两行:

createtheLock 创建临时顺序节点 internalLockLoop 判断是否创建成功

创建临时顺序节点

StandardLockInternalsDriver#createtheLock

可以看出节点的Mode是CreateMode.EPHEMERAL_SEQUENTIAL,表示这是一个临时顺序节点!

进入 CreatebuilderImpl#forPath(java.lang.String, byte[])

client.getDefaultData() 就是本机 IP 地址。

这个 adjustPath 方法看名字就是在调整路径之类的。会生成一个 UUID 拼接到 /locks/lock_01 中,变成 /locks/lock_01/_c_UUID-lock-。

因为创建的是临时顺序节点,所以会自动在后面添加顺序,最终变为 /locks/lock_01/_c_UUID-lock-0000000000。

具体创建节点是在 CreatebuilderImpl#pathInfoReground 中。

创建临时节点,如果路径存在,会创建成功,如果路径不存在会创建失败;

创建失败后,先创建路径,再创建节点。

总结

本篇文章主要介绍了基于 Zookeeper 的分布式锁框架 Curator 的使用,以及加锁流程,源码分析。

下面对内容做下总结:

重点需要关注的是:

基于 Zookeeper 的分布式锁,是使用的临时顺序节点,父节点是持久节点; 创建临时节点时,父节点不存在,会先创建父节点(路径); 锁的组成结构为:对 /locks/lock_01 加锁,实际锁住的是 /locks/lock_01/_c_UUID-lock-序号,举例为 /locks/lock_01/_c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000

引用链接:

Zookeeper Shared Reentrant Lock: https://curator.apache.org/curator-recipes/shared-reentrant-lock.html

OpenMagic API

Need more than content? Move into the product flow.

If you are here for model access, pricing, developer docs, or the future API console, the dedicated product path now lives on api.openmagic.ai.

登录免费注册