首页 > 其他分享 >分布式锁和事务

分布式锁和事务

时间:2023-04-05 11:23:50浏览次数:29  
标签:事务 zk 临时 jvm 唤醒 节点 分布式

1.分布式锁的实现方式?

1.基于数据库实现 -mysql行锁
2.基于zookeeper -CP模式
3.基于Redis setnx实现 -AP模式
4.Redis框架 Redission,RedisLock
要求:保证一致性 zk实现分布式锁
保证可用性 redis实现分布式锁

2.Zookeeper实现分布式锁
原理:zookeeper节点路径不能重复,保证唯一性,通过临时节点+事件通知来实现。

多个jvm在zk上同时创建一个相同的临时节点,有zk节点路径的唯一性,只有一个jvm会创建成功,其他jvm会尝试重试,如果尝试多次创建临时节点失败。就会订阅当前临时节点,然后变为阻塞状态,当jvm01业务执行完释放锁(调用close()方法)因为是临时节点,所以调用close方法时就会删除zk上对应的临时节点,因为在zk上有事件通知,删除掉节点会同时向订阅了当前临时节点的其他jvm发送通知,唤醒其他正在阻塞的jvm参与锁的竞争。

获取锁成功但是由于业务逻辑超时一直不释放情况下怎么解决?
依靠zk自身的sessionTimeout来删除节点释放锁,防止其他的jvm一直阻塞等待,将业务代码全部回滚,使用手动事务。

zookeeper实现分布式锁如何避免羊群效应?
羊群效应:当参与同一个锁竞争的jvm数量很大时,第一个jvm获取到锁,逻辑执行完释放锁,这时候zkServer就要去唤醒其余的数量很大的阻塞状态的jvm,可能唤醒到一半的时候其他进程已获取到锁,成本很高,所以要采用临时顺序节点的方式。

  • 基于临时顺序节点实现分布式锁:

先创建一个根路径,多个jvm在根路径下创建多个顺序节点,当某个jvm创建的临时顺序节点最小时,代表当前jvm获取锁成功,jvm02获取锁失败,就会订阅前一个节点,即jvm01,当01释放锁删除01节点后,jvm02成为最小的临时顺序节点,获取锁成功,jvm03以此类推,订阅前一个节点,当前一个节点释放锁,删除节点,当前节点变为最小的临时顺序节点,获取锁成功。相当于juc中的公平锁,这样在唤醒的时候不必唤醒所有的节点,只需唤醒一个节点即可。

标签:事务,zk,临时,jvm,唤醒,节点,分布式
From: https://www.cnblogs.com/huang580256/p/17288991.html

相关文章

  • Redis事务与Lua脚本
    Redis的事务没办法保证一致性,使用Lua脚本也不能保证。Lua脚本能保证一致性,而且比redis的事务实习要简洁健壮。转载:https://maimai.cn/article/detail?fid=1538576512&efid=SQ3XsywteU9lIxil766Lxw......
  • 分布式存储系统可靠性:系统量化估算
    一、引言我们常常听到衡量分布式存储系统好坏的两个指标:可用性和可靠性指标。可用性指的是系统服务的可用性。一般按全年可用时间除以全年时间来衡量可用性的好坏,平常我们说的SLA指标就是可用性指标,这里就不展开细说。可靠性指标指的是数据的可靠性。我们常说的数据可靠性11个9,在......
  • 分布式搜索引擎Elasticsearch的架构分析
    一、写在前面 ES(Elasticsearch下文统一称为ES)越来越多的企业在业务场景是使用ES存储自己的非结构化数据,例如电商业务实现商品站内搜索,数据指标分析,日志分析等,ES作为传统关系型数据库的补充,提供了关系型数据库不具备的一些能力。ES最先进入大众视野的是其能够实现全文搜索的能力,也......
  • jmeter分布式测试安装部署步骤
    一、下载linux版本的jdk----注:下载的jdk和jmeter要与window的jdk和jmeter一致下载地址:https://www.oracle.com/java/technologies/downloads/#java11二、在虚拟机中使用suroot超级管理员的账号进行操作,在/usr/local下创建jdk文件夹 在linux中输入命令:cd/usr/local  --......
  • Spring——spring事务原理与实战
    摘要Spring为事务管理提供了丰富的功能支持。Spring事务管理分为编程式和声明式两种。编程式事务指的是通过编码方式实现事务;声明式事务基于AOP,将具体的逻辑与事务处理解耦。生命式事务管理使业务代码逻辑不受污染,因此实际使用中声明式事务用的比较多。声明式事务有两种方式,一种......
  • Jmeter搭建分布式压测环境
    最近在做性能测试,本来以为一台压力机就够啦,但是在压测一个查询接口的时候,当TPS达到500多的时候就开始报错,经过定位是压力机出现啦瓶颈,于是决定对压力机做一下分布式,经过调试环境部署成功,再次压测时候问题解决。下面记录一下部署分布式环境的过程。使用的工具及版本:JDK:1.8.0_211......
  • 分布式定时任务调度框架实践
    vivo互联网技术微信公众号 作者:陈王荣分布式任务调度框架几乎是每个大型应用必备的工具,本文介绍了任务调度框架使用的需求背景和痛点,对业界普遍使用的开源分布式任务调度框架的使用进行了探究实践,并分析了这几种框架的优劣势和对自身业务的思考。一、业务背景1.1为什么需要使......
  • InnoDB 事务加锁分析
    vivo互联网技术微信公众号 作者:何志创一般大家对数据库事务的了解可能停留在事务的ACID特性以及事务4种不同的隔离级别层面上,而对于事务4种不同隔离级别如何实现了解相对较少。本文以MySQL数据库 InnoDB 引擎为例,为大家分析 InnoDB数据库引擎对默认的隔离级别可重复读(RR......
  • vba-事务
    SubaccTrans()DimConnAsNewADODB.Connection'Conn.Open".......连接你的Acc数据库.........."OnErrorGoToErrHndl:Conn.BeginTrans'事务开始Sql="updateasetnum=1000whereid=24"'第一个sql语句......
  • 分布式系统——并发条件下如何保证缓存与DB数据一致性
    什么是数据一致性我们常说的数据一致性指的是在程序运行过程中本地缓存、分布式缓存、数据库三者之间的数据一致性常见的本地缓存有hashmap、currenthashmap、guavacache、caffeine分布式缓存常见的有redis、memcache常见数据不一致常见有:本地缓存与mysql不一致redis......