网站可以多个域名吗,南宁的网站建设,山东大源建设集团网站,app制作教程简单易学目录 介绍
下载安装 基本指令编辑
java集成zookeeper
官方提供版
永久节点 临时节点编辑 永久序列化节点
判断当前节点是否存在 获取当前节点中的数据内容 获取当前节点的子节点
更新节点内容
删除节点 zookeeper实现分布式锁
Mysql实现分布式锁
总结 介绍
ZooK…目录 介绍
下载安装 基本指令编辑
java集成zookeeper
官方提供版
永久节点 临时节点编辑 永久序列化节点
判断当前节点是否存在 获取当前节点中的数据内容 获取当前节点的子节点
更新节点内容
删除节点 zookeeper实现分布式锁
Mysql实现分布式锁
总结 介绍
ZooKeeper是一个开源的分布式协调服务它提供了一套强大的原语和工具用于构建分布式系统中的协调和同步机制。其中之一就是分布式锁。
分布式锁是一种用于在分布式系统中实现资源互斥访问的机制。在多个节点同时访问共享资源时分布式锁可以确保只有一个节点能够获取到锁从而避免数据竞争和冲突。
ZooKeeper分布式锁的实现主要依赖于ZooKeeper的有序节点和临时节点特性。下面是分布式锁的基本实现步骤 创建一个持久的ZooKeeper节点作为分布式锁的根节点例如/locks。 当一个节点需要获取锁时它会在/locks节点下创建一个有序的临时节点例如/locks/lock-000000001。 节点获取到锁的条件是它创建的节点是当前所有节点中最小的节点。 节点检查自己创建的节点是否是当前所有节点中最小的节点如果是则表示节点获取到了锁可以继续执行业务逻辑如果不是则节点需要监听前一个节点的删除事件。 当前一个节点释放锁时它会删除自己创建的节点。 其他节点监听到前一个节点的删除事件后重复步骤4直到获取到锁。
通过这样的方式ZooKeeper分布式锁可以保证只有一个节点能够获取到锁其他节点需要等待。当获取到锁的节点完成业务逻辑后会释放锁让其他节点有机会获取到锁。
需要注意的是ZooKeeper分布式锁的实现需要考虑异常情况和竞态条件例如节点宕机、网络分区等以保证锁的可靠性和正确性。
ZooKeeper分布式锁是通过有序节点和临时节点特性实现的它可以在分布式系统中实现资源的互斥访问确保只有一个节点能够获取到锁。这种机制可以帮助开发者解决分布式系统中的并发访问问题。
下载安装
在官网进行下载安装包
Apache ZooKeeper 这里以长期稳定版编译版为例测试
连接服务器,创建zookeeper文件夹,然后将下载好的tar包上传至服务器 上传 解压包 tar -zxvf apache-zookeeper-3.8.2.tar.gz 查看解压后包 进入配置文件夹 但是zookeeper启动时加载的是zoo.cfg配置文件,并不是该模板配置文件,所以在该模板配置文件基础上需要另外创建并书写一个zoo.cfg配置文件 cp zoo_sample.cfg zoo.cfg 来到zp目录下先创建一个数据目录,等下要书写在zoo.cfg配置文件中
,注意数据目录是和conf文件夹等同级 复制data目录路径 编辑配置zoo.cfg文件 其他使用默认即可 切换脚本目录启动zookeeper 注意 启动zookeeper需要jdk环境,需提前在服务器中配置好jdk环境 ./zkServer.sh start 启动 ./zkServer.sh stop 停止 ./zkServer.sh restart 重启 ./zkServer.sh status 查看状态 基本指令 java集成zookeeper
官方提供版
引入所需依赖 dependency groupIdorg.apache.zookeeper/groupId artifactIdzookeeper/artifactId version3.7.0/version /dependency 永久节点 临时节点 由于临时节点在链接关闭后就自动清除掉,所以这里演示时加断点进行演示 查看节点列表 临时节点test2存在 放开断点 永久序列化节点 永久临时序列化节点不再演示
判断当前节点是否存在
先看下当前列表的节点有哪些 获取当前节点中的数据内容
先设置node节点内容值 获取当前节点的子节点 更新节点内容 删除节点
先查看下node节点下有哪些节点 zookeeper实现分布式锁
引入curator依赖 主要代码中使用的代码和场景继承自本博主上一篇redis分布式锁的场景,所以不再从头梳理 dependencygroupIdorg.apache.curator/groupIdartifactIdcurator-framework/artifactIdversion4.3.0/versionexclusionsexclusiongroupIdorg.apache.zookeeper/groupIdartifactIdzookeeper/artifactId/exclusion/exclusions/dependencydependencygroupIdorg.apache.curator/groupIdartifactIdcurator-recipes/artifactIdversion4.3.0/versionexclusionsexclusiongroupIdorg.apache.zookeeper/groupIdartifactIdzookeeper/artifactId/exclusion/exclusions/dependency
书写配置类 服务层: 重置库存后重启服务压测 压测日志: 可以看到在高并发场景下性能上并不是太好
查看库存: 符合预期库存为0没有超卖 Mysql实现分布式锁 实现思路:基于唯一键索引实现
新建一个lock表 代码实现
服务层 修改库存1000开始压测 压测日志 性能感人o(╥﹏╥)o
库存结果 达到预期0 但是性能确实有些感人 总结