Zookeeper实现分布式锁

news2024/9/22 13:32:30

文章目录

    • ZK节点类型
    • watch监听机制
    • Zookeeper实现分布式锁
      • 锁原理
      • 创建锁的过程
      • 释放锁的过程
      • ZK锁的种类
    • 代码实现

Zookeeper是一个开源的分布式协调服务,是一个典型的分布式数据一致性解决方案。

分布式应用程序可以基于Zookeeper实现诸如数据发布/订阅,负载均衡,命名服务,分布式协调/通知,集群管理,Master选举,分布式锁和分布式队列等功能。

ZK节点类型

  • 临时节点
    客户端与zookeeper断开连接后,该节点会自动删除

  • 临时有序节点
    客户端与zookeeper断开连接后,该节点会自动删除,但是这些节点都是有序排列的。

  • 持久节点
    客户端与zookeeper断开连接后,该节点依然存在

  • 持久节点
    客户端与zookeeper断开连接后,该节点依然存在,但是这些节点都是有序排列的。

watch监听机制

主要是监听以下节点变化信息

  • 节点创建
  • 节点删除
  • 节点数据修改
  • 子节点变更

Zookeeper实现分布式锁

锁原理

多个客户端来竞争锁,各自创建自己的节点,按照顺序创建,谁排在第一个,谁就成功的获取了锁。

就像排队买东西一样,谁排在第一个,谁就先买。
在这里插入图片描述

创建锁的过程

  1. A、B、C、D四个客户端来抢锁

  2. A 先来了,他创建了000001的临时顺序节点,他发现自己是最小的节点,那么就成功的获取到了锁

  3. 然后 B 来获取锁,他按照顺序创建了000001的临时顺序节点,发现前面有一个比他小的节点,那么就获取锁失败。他开始监听A客户端,看他什么时候能释放锁

  4. 同理C和D。

释放锁的过程

  1. A 客户端执行完任务后,断开了和zookeeper的会话,这时候临时顺序节点自动删除了,也就释放了锁

  2. B 客户端一直在虎视眈眈的watch监听着A,发现他释放了锁,立马就判断自己是不是最小的节点,如果是就获取锁成功

  3. C 监听着B,D监听着C。

分布式锁的流程图

在这里插入图片描述

ZK锁的种类

  • InterProcessMutex 分布式可重入排它锁
  • InterProcessSemaphoreMutex 分布式排它锁
  • InterProcessReadWriteLock 分布式可读写锁
  • InterProcessMultiLock 用多个锁去进行一组操作
  • InterProcessSemaphoreV2 共享信号量

代码实现

我们这里直接用封装好的工具类,因为如果你自己写的话,如果测试不到位,一旦线上出现问题,那就是大问题。

这里我们用curator这个工具类,他这里把分布式锁已经都给我们实现好了,我们使用起来就像ReentrantLock这些锁一样,非常简单。

<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>4.0.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.10</version>
</dependency>
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.retry.RetryNTimes;
import java.util.concurrent.TimeUnit;

public class CuratorDistrLockTest implements Runnable{

    //zookeeper的地址
    private static final String ZK_ADDRESS = "127.0.0.1:2181";

    private static final String ZK_LOCK_PATH = "/zkLock";

    static CuratorFramework client = null;

    static {
        // 连接ZK,如果连接失败,设置每5000毫秒重试一次,最多重试10次
        client = CuratorFrameworkFactory.newClient(ZK_ADDRESS,
                new RetryNTimes(10, 5000));
        client.start();
    }

    private static void curatorLockTest() {

        InterProcessMutex lock = new InterProcessMutex(client, ZK_LOCK_PATH);
        try {
            if (lock.acquire(6 * 1000, TimeUnit.SECONDS)) {
                System.out.println("====== " + Thread.currentThread().getName() + " 抢到了锁 ======");
                //执行业务逻辑
                Thread.sleep(15000);
                System.out.println(Thread.currentThread().getName() + "任务执行完毕");
            }
        } catch (Exception e) {
            System.out.println("业务异常");
        } finally {
            try {
                lock.release();
            } catch (Exception e) {
                System.out.println("锁释放异常");
            }
        }
    }

    public static void main(String[] args) {
        // 用两个线程,模拟两个客户端
        // 每个线程创建各自的zookeeper连接对象
        new Thread(new CuratorDistrLockTest()).start();

        new Thread(new CuratorDistrLockTest()).start();
    }

    @Override
    public void run() {
        curatorLockTest();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/341661.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C/C++基础练习题】简单指针与数组使用练习题

&#x1f349;内容专栏&#xff1a;【C/C要打好基础啊】 &#x1f349;本文内容&#xff1a;简单指针与数组练习题&#xff08;复习之前写过的实验报告&#xff09; &#x1f349;本文作者&#xff1a;Melon西西 &#x1f349;发布时间 &#xff1a;2023.2.12 目录 1.vector​编…

async thunk 解决 API 调用的依赖问题

async thunk 解决 API 调用的依赖问题 一句话节省看下面一堆内容的时间就是&#xff1a; async thunk 中可以使用 async/await 锁住其他的 action 操作 一般 API 之间存在三种情况&#xff1a; A 和 B 之间没有依赖关系 这样的情况下&#xff0c;A 和 B 可以各调用各的&#x…

最近大热的 chatGPT 会取代你的工作吗?

ChatGPT 由于其高效的自然语言处理能力&#xff0c;它最容易取代的领域可能是&#xff1a; 文本分类&#xff1a;ChatGPT 可以用作文本分类系统&#xff0c;对文本进行分类 聊天机器人&#xff1a;ChatGPT 可以制作聊天机器人&#xff0c;提供人性化的交互体验 文本生成&…

策略游戏与实践反馈

早上看到time&#xff08;李培楠&#xff09;居然击败maru得了IEM的冠军&#xff0c;加上即时战略游戏的没落&#xff0c;星际2的研发停止&#xff0c;以及最近曾经被大家膜拜的暴雪闹出的各种事情&#xff0c;各种百感交集吧&#xff0c;从2000年上手星际争霸1开始&#xff0c…

【SPSS】数据预处理基础教程(附案例实战)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

2.10、时间片轮转、优先级调度算法、多级反馈队列调度算法

Tips&#xff1a;各种调度算法的学习思路 算法思想 算法规则 这种调度算法是用于作业调度还是进程调度? 抢占式? 非抢占式? 优点和缺点 是否会导致饥饿\color{red}饥饿饥饿 某 进程/作业 长期得不到服务 1、时间片轮转&#xff08;RR, Round-Robin&#xff09; 1.1、例…

别具一格,原创唯美浪漫情人节表白专辑,(复制就可用)(html5,css3,svg)表白爱心代码(2)

别具一格&#xff0c;原创唯美浪漫情人节表白专辑&#xff0c;(复制就可用)&#xff08;html5,css3,svg)表白爱心代码(2) 目录 ​​​​​​​款式二&#xff1a;心形实时显示认识多长时间桃花飞舞&#xff08;爱心&#xff09;款 1、拷贝完整源代码 2、拷贝完整js代码 3、…

漏洞修复 Zookeeper、MySQL、Elasticsearch

漏洞修复 一、HTTP漏洞修复 1.1 漏洞说明 1.2 漏洞修复 1.2.1 升级HTTPD到最新版本&#xff08;2.4.53&#xff09; 1.2.1.1 服务器有网的情况下执行以下操作&#xff1a; 安装CodeIT库 cd /etc/yum.repos.d wget https://repo.codeit.guru/codeit.el7.repo 更新httpd y…

解决需求变更难题的8大方案

需求变更8大原因为什么会出现需求变更&#xff0c;这是由于需求约束、规则有了新的变化、由于政策发生变化&#xff0c;客户、沟通方式、流程化、标准化的问题等导致。这里在在过去的项目经验中&#xff0c;提出了常见的8大需求变更的原因。政策发生变化&#xff1a;指由于国家…

牛客网Python篇数据分析习题(三)

1.现有一个Nowcoder.csv文件&#xff0c;它记录了牛客网的部分用户数据&#xff0c;包含如下字段&#xff08;字段与字段之间以逗号间隔&#xff09;&#xff1a; Nowcoder_ID&#xff1a;用户ID Level&#xff1a;等级 Achievement_value&#xff1a;成就值 Num_of_exercise&a…

华为OD机试 - 去除多余空格(Python)| 真题+思路+代码

去除多余空格 题目 去除文本多余空格,但不去除配对单引号之间的多余空格。给出关键词的起始和结束下标,去除多余空格后刷新关键词的起始和结束下标。 条件约束: 不考虑关键词起始和结束位置为空格的场景;单词的的开始和结束下标保证涵盖一个完整的单词,即一个坐标对开…

flurry+atos crash代码定位

flurry 崩溃日志代码定位 用symbolicatecrash工具分析iOS Crash文件通过atos符号化崩溃报告 1.写测试crash代码&#xff08;方便检测最后crash是否定位正确 **MineViewController-xima方法-485行&#xff09; 2.代码中flurry sdk打开crash追踪&#xff08;默认为NO&#xff0…

Prometheus 告警规则

Prometheus 告警规则 Prometheus官方内置的第三方报警通知包括&#xff1a;邮件、 即时通讯软件&#xff08;如Slack、Hipchat&#xff09;、移动应用消息推送(如Pushover)和自动化运维工具&#xff08;例如&#xff1a;Pagerduty、Opsgenie、Victorops&#xff09; Promethe…

Allegro如何批量快速修改复用好的模块操作指导

Allegro如何批量快速修改复用好的模块操作指导 在做PCB设计的时候,相同模块可以用reuse复用的功能,可以大大提升效率,但是模块需要修改的时候,其它模块也要跟着修改,逐个再去复用一遍比较费时间,Allegro支持批量快速修改复用好的模块 前提是相同模块必须是相同的mdd文件…

Ray和极客们的创新之作,2月18日来发现

所在论坛&#xff1a;数据库技术创新&云原生论坛分享时段&#xff1a;2.18 10:30-11:00分享主题&#xff1a;云原生数据库PieCloudDB &#xff1a;Unbreakable安全特性剖析分享嘉宾&#xff1a;王淏舟&#xff0c;拓数派资深研发工程师 由中国开源软件推进联盟PostgreSQL分…

Ansible的部署和命令模块

Ansible的部署和命令模块目录一、ansible 的概述1.1ansible简介1.2官方网站1.3ansible 的特点1.4ansible的工作机制1.5ansible的组成模块二、ansible部署2.1环境准备2.2Asible的安装三、ansible 命令行模块3.1command 模块3.2shell 模块3.3cron 模块3.4user 模块3.5group 模块3…

【java】40 个 SpringBoot 常用注解(建议收藏)

本文目录一、Spring Web MVC 注解Spring Web MVC 注解RequestMappingRequestBodyGetMappingPostMappingPutMappingDeleteMappingPatchMappingControllerAdviceResponseBodyExceptionHandlerResponseStatusPathVariableRequestParamControllerRestControllerModelAttributeCross…

王道操作系统笔记(七)——— 内存管理的基本要求和连续分配管理方式

文章目录一、内存的概念和作用二、内存管理的概念三、进程运行的基本原理和要求3.1 程序执行过程3.2 逻辑地址和物理地址3.3 程序的链接3.4 程序的装入3.5 内存保护四、覆盖与交换4.1 覆盖技术4.2 交换技术五、连续分配管理方式5.1 单一连续分配5.2 固定分区分配5.3 动态分区分…

解决ArcSWAT 2012.10_8.25安装 Error 1001 无法获得SWAT_HRU.dll程序集中安装程序类型。->无法加载一个或多个请求熟悉

问题描述 Error1001.无法获得G:SWATArcSWATSWAT_HRUsdll 程序集中的安装程序类型。->无法加载一个或多个请求的类型。有关更多信息&#xff0c;请检索LoaderExceptions 属性。 这是由于找不到对应的dll文件。 参考ArcSWAT的帮助文档后&#xff0c;发现该版本 对应的ArcGI…

revit中如何创建有坡度的排水沟及基坑?

一、revit中如何创建有坡度的排水沟? 先分享一张有坡度排水沟的族的照片给大家加深一下印象&#xff0c;有了一个粗略的直观认识&#xff0c;小编就来说说做这个族的前期思路吧。 一、前期思路&#xff1a; 1、 用拼接的方式把这个族形状拼出来&#xff0c;先用放样&#xff0…