微服务实战系列之ZooKeeper(下)

前言

通过前序两篇关于ZooKeeper的介绍和总结,我们可以大致理解了它是什么,它有哪些重要组成部分。

今天,博主特别介绍一下ZooKeeper的一个核心应用场景:分布式锁

在这里插入图片描述

应用ZooKeeper

Q:什么是分布式锁

首先了解一下,什么是锁。

1. 什么是锁

在我们日常开发中,可能会经常使用多线程并发,以提高系统性能,加速代码的处理效率。那么问题也就来了?当在有限的资源、网络环境下,如果一味追求并发,势必拖垮整个系统,甚至宕机。

在这里插入图片描述
所以,Java在推出之时,就提供了多种锁机制,以避免或降低上述问题的发生。
也就是一句话总结,什么是锁:

通过有序的处理手段,实现线程安全和数据准确,保障系统正常运转。

当然Java中的锁机制,已经很多介绍了,这里不再展开。

2. 什么是分布式锁

所谓分布式锁,无非是在分布式环境下,如何使用“锁”的机制。所以在这里,我们重点讲一下分布式环境下,ZooKeeper如何使用锁,保障线程安全和数据准确,避免并发带来的问题。

在这里插入图片描述

3. 基础概念

3.1 Znode-节点
Znode其实就是ZooKeeper文件节点,因为是多层树状结构,因此,每层节点可以理解为一个Node(节点)。ZooKeeper提供了四类Node:

Znode类型Znode简介
PERSISTENT永久节点,已持久化至存储,即使客户端断开,也存在
EPHEMERAL临时节点,客户端断开即删除
PERSISTENT_SEQUENTIAL永久节点,按序顺序编号
EPHEMERAL_SEQUENTIAL临时节点,按序顺序编号

3.2 Event-事件
ZooKeeper提供了四种监听事件,当节点数据或结构变化时,即通知客户端:

  1. 节点创建
  2. 节点删除
  3. 节点数据修改
  4. 子节点变更
Q:如何实现分布式锁

通过以上对“分布式锁”的解剖,我们应该知道了它是如何运转的,其实核心是两个点:

  1. 顺序排队
  2. 加锁解锁

这不巧了,ZooKeeper的树形数据结构,正好完美实现了以上2点。
在这里插入图片描述

1. 先来先加锁
首先,假如小张作为第一名,通过ZK(ZooKeeper行业简称),创建了第一个锁。这里所谓的“锁”,其实一个全局唯一的文件(即ZNode)。创建ZNode完成后,即可以通过锁定目标资源,进行后序操作。如果此刻小王来了,怎么办?

2. 后来等解锁
小王作为(按顺序)第二名前来索取资源,当然无法如愿以偿,那得先看小张答不答应了。但小张此刻正手忙脚乱,哪有闲功夫管什么小王小李…的事。所以ZK想到了一个好办法:“你可以不主动,那我主动好了”。通过给小王加“跟踪器”,就可以随时随地知道小王的一举一动了。

如果小王拿完资源后,ZK会通过事件通知小王,那么小王当然可以顺理成章的索取资源了。当然前提是小王退出竞争行列,如何退出? 简单一句话:“拿来什么,带走什么”。ZNode乃身外之物,真正做到了“无痕访问”了。

通过以上机制,ZK提供了一整套加锁解锁的方法,所以在分布式场景下,它自然能够合理有效地解决了资源竞争问题。


结语

在并发环境下,往往经常遇到资源竞争问题,当你考虑如何解决竞争时,ZooKeeper是一个合理的选择。当然集群部署是必要,唯一的考虑是成本是否足够。

好了,博主通过上中下三篇,揭秘ZooKeeper,从功能、内核、应用三个方向,分别对它加以说明。希望各位盆友可以学到,进而用到实际工作中。感谢捧场,欢迎订阅与分享!


历史回顾

  • 微服务实战系列之ZooKeeper(中)
  • 微服务实战系列之ZooKeeper(上)
  • 微服务实战系列之MQ
  • 微服务实战系列之通信
  • 微服务实战系列之J2Cache
  • 微服务实战系列之Cache(技巧篇)
  • 微服务实战系列之MemCache
  • 微服务实战系列之EhCache
  • 微服务实战系列之Redis
  • 微服务实战系列之Cache
  • 微服务实战系列之Nginx(技巧篇)
  • 微服务实战系列之Nginx
  • 微服务实战系列之Feign
  • 微服务实战系列之Sentinel
  • 微服务实战系列之Token
  • 微服务实战系列之Nacos
  • 微服务实战系列之Gateway
  • 微服务实战系列之加密RSA
  • 微服务实战系列之签名Sign

在这里插入图片描述

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

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

相关文章

04 python函数

4.1 函数的快速开发体验 """ 演示,快速体验函数的开发和使用 """#需求,统计字符串的长度,不使用内置函数len()str1 itheima str2 itcast str3 python#定义一个计数的变量 count 0 for i in str1:count 1…

FPGA使用乘法的方式

FPGA使用乘法的方式 方法一:直接使用乘法符“*” 源代码 module multiply(input [7:0] a,input [7:0] b,output wire [15:0] result);(*use_dsp48 = "yes"*) wire [15:0] result;assign result = a*b; endmodule仿真代码 module multiply_tb();reg [7:0] a; re…

Python实验 —— 图形化编程入门案例

Python实验 —— 图形化编程 实验目的实验内容实验结果蟒蛇绘制程序计算Pi值树的绘制词频统计绘制艺术图 实验目的 (1)熟悉 PYTHON 的语法格式 (2)熟练使用集成开发环境 SPYDER 或者 PyCharm (3)熟练 PYTH…

java minio通过getPresignedObjectUrl设置(自定义)预签名URL下载文件的响应文件名之minio源码改造方案

Minio预签名URL自定义响应文件名之Minio源码改造 需求说明Minio源码改造一、环境准备二、下载Minio源代码三、修改源代码1.修改cmd目录下的api-router.go这个代码文件2.将filename参数值设置到响应头4.修改验证签名时是否需要带入filename参数验证 四、大功告成,编译…

残差网络中的BN (Batch Normalization 批标准化层)的作用是什么?

文章目录 什么是BN (Batch Normalization 批标准化层)一、BN层对输入信号进行以下操作:二、BN 层有什么作用? 什么是BN (Batch Normalization 批标准化层) BN层的全称是Batch Normalization层,中文可以翻译为批标准化…

如何让.NET应用使用更大的内存

我一直在思考为何Redis这种应用就能独占那么大的内存空间而我开发的应用为何只有4GB大小左右,在此基础上也问了一些大佬,最终还是验证下自己的猜测。 操作系统限制 主要为32位操作系统和64位操作系统。 每个进程自身还分为了用户进程空间和内核进程空…

【C语言】7-55 分寝室 分数 20

7-55 分寝室 分数 20 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 学校新建了宿舍楼,共有 n 间寝室。等待分配的学生中,有女生 n0​ 位、男生 n1​ 位。所有待分配的学生都必须分到一间寝室。所有的寝室都要分出去,最后不能有寝室留空…

Mybatis-Spring整合原理:MapperFactoryBean和MapperScannerConfigurer的区别及源码剖析

文章目录 引言MapperFactoryBean的用法和优缺点MapperScannerConfigurer的用法和优缺点MapperFactoryBean源码分析MapperScannerConfigurer源码分析Spring容器初始化流程回顾核心方法:postProcessBeanDefinitionRegistryBeanDefinitionRegistryPostProcessor和BeanF…

Java 并发编程(六)-Fork/Join异步回调

一、并发编程 1、Fork/Join分支合并框架 Fork/Join它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。Fork/Join框架要完成两件事情: Fork:把一个复杂任务进行分拆&#xff0…

BP神经网络原理,基于BP神经网络的去噪算法,基于BP神经网络的调制信号去噪

目录 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 遗传算法原理 遗传算法主要参数 遗传算法流程图 完整代码包含数据下载链接: 基于BP神经网络的去噪算法,基于BP神经网络的调制信号去噪(代码…

下午好~ 我的论文【CV边角料】(第三期)

文章目录 CV边角料Pixel ShuffleSENetCBAMGlobal Context Block (GC)Criss-Cross Attention modules (CC) CV边角料 Pixel Shuffle Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network pixelshuffle算法的实现流…

EXCEL SUM类函数

目录 一. SUM二. SUMIF三. SUMIFS四. SUMPRODUCT 一. SUM ⏹对一列或一组单元格中的数字进行求和。 基本语法 SUM(number1, [number2], ...)✅统计所有产品的总数量 SUM(C2:C13) 二. SUMIF ⏹按照特定条件对范围内的单元格进行求和的函数。 基本语法 SUMIF(条件区域, 指定…

山西电力市场日前价格预测【2023-12-16】

日前价格预测 预测说明: 如上图所示,预测明日(2023-12-16)山西电力市场全天平均日前电价为259.00元/MWh。其中,最高日前电价为333.74元/MWh,预计出现在18:00。最低日前电价为0.00元/MWh,预计出…

Golang 二分查找 LEETCODE704 小记

二分查找 leetcode704 前面部分第4题,包括使用条件等感谢代码随想录:) leetcode704 二分查找用于在有序且不重复的元素列表中寻找需要的元素,返回其位置或错误 当要求算法的时间复杂度在O(logn) 等带log的复杂度时&am…

C语言训练:三个字符串比较大小,实现两个整数数的交换统计二进制中1的个数

目录 一、编写程序,输入三个字符串,比较它们的大小,并将它们按由小到大的顺序输出。要求用函数、指针实现。要求:要采用函数调用,并用指向函数的指针作为函数的参数。 1.不使用函数指针作为参数,并自己模拟strcmp。 …

Flume 安装与部署

目录 Flume 下载地址 (1)将 apache-flume-1.9.0-bin.tar.gz 上传到 linux 的 /opt/software 目录下 (2)解压 apache-flume-1.9.0-bin.tar.gz 到 /opt/module/ 目录下 huweihadoop101 ~]$ tar -zxvf /opt/software/apache-flume-…

001 Windows虚拟机

一、虚拟机安装Windows10 选自定义安装 升级是针对你电脑上有系统的情况下,你要升级;没有系统就选择自定义。 硬盘60G 直接单击下一步就是一个盘 如果你想对磁盘进行分区 分第一个区的时候它会去创建系统的保留分区和系统分区,然后还剩20…

acwing算法提高之动态规划--状态压缩DP

目录 1 基础知识2 模板3 工程化 1 基础知识 暂无。。。 2 模板 暂无。。。 3 工程化 题目1:小国王。 解题思路:状态压缩DP。 状态定义f[i][j][a]:表示已经考虑了前i行,并且摆放了j个国王,且第i行的状态是a的总方…

qt程序在Linux下打包的一般流程

编译 手动编写编译脚本 qmake make复制依赖库 参考文章: https://blog.csdn.net/JOBbaba/article/details/124289626 https://zhuanlan.zhihu.com/p/49919048 复制系统依赖库 编写复制脚本copy.sh ldd复制Qt依赖库 主要是libqxcb.so的相关依赖需要复制&…

流量分析基础

定义: 流量分析(Traffic Analysis)是指对网络流量数据进行分析和解释,以获得有关网络中通信的信息和情报。这种技术可以用于网络安全、网络管理和网络优化等领域。 网络流量包含了许多有关网络通信的细节信息,如源IP地…