当前位置: 首页 > 网络应用技术

场景中的电源和其他问题,分布式分布式锁的详细说明

时间:2023-03-07 16:01:39 网络应用技术

  简介:本文从指甲的实际身份验证方案中的数据重复问题开始。原因是原因是,由并发症和权力的力量引起的失败概念会导致权力。结合了人们的沟通记录和业务情况,简要分析了数据库功率和其他问题,并就分布式锁定实施功率和其他方法进行了详细的讨论。分析了分布式方案中存在的问题,包括单个点 - 点故障,网络超时,其他锁的错误释放,提前释放锁以及分布式锁定单点故障等,并提出了相应的解决方案,引入了特定方案的特定计划。ACCOMPLISH。

  作者|Bai Shu来源|阿里技术公共帐户

  写在前面:本文中讨论的力量和其他问题都是所有问题,例如场景中的力量,也就是说,系统具有功率和其他设计的设计,但在平行场景中失败了。

  本文从实际身份验证方案中的数据重复问题开始。原因是原因是并发引起的失败概念,这会导致权力等权力,并导致权力。

  为了应对同时场景中的权力等问题,提出了一种可行的方法,例如实现权力。结合了人们的沟通记录和业务情况,简要分析了数据库功率和其他问题,并就分布式锁定实施功率和其他方法进行了详细的讨论。

  分析分布式方案中存在的问题,包括单点故障,网络超时,其他锁的错误释放,提前发布锁以及分布式锁定锁定点故障等,并提出了相应的解决方案,引入了该解决方案特定方案。

  Dingxian真实认证业务的重复数据存在问题。

  1个问题现象

  在正常情况下,数据库中应只有一个真实的身份验证记录,但实际上某个用户具有多个。

  2问题的原因

  同时导致未经许可。

  让我们回顾一下权力的概念,依此类推:

  愿意和idempotnce是数学和计算机的概念,通常是在抽象代数中。诸如编程幂之类的权力的特征是,任何多个执行的效果与一个执行的影响相同。

  实际的身份验证在业务中具有功率设计。一般过程是:

  1)用户在选择真实的人身份验证后将在服务器上初始化记录;2)用户根据指甲移动终端上的说明完成面部面部比较;

  在步骤3中,在修改数据库状态之前,它将确定是否已经“初始化”,是否已经过身份验证”,以及“知识分子科学是否回到认证成功”以确保权力。首次访问服务器以修改数据库状态,您可以符合电源和其他数据库状态的判断条件。其余请求将直接返回,这不会影响数据库的状态。服务器与首次访问服务方面的请求一致。因此,在成功的身份验证的前提下,数据库应具有成功认证的记录。

  但是,在实际过程中,我们发现相同的请求将多次修改数据库状态,并且该系统没有像我们预期的那样意识到权力。原因是因为对请求进行了访谈。在完成服务器修改的第一个请求之前,其他请求和第一个请求已通过了电源的判断,并且数据库状态已多次修改。

  同时导致原始功率的设计失败。

  同时导致未经许可。

  解决场景中的电源等问题的关键是找到独特的约束,执行独特的考试并一次保存相同的数据,然后一次相同的请求操作。

  服务终端的请求可以生成以下交互:

  一个请求只能包括一个交互或多个交互。例如,请求只能修改数据库状态,或者在修改数据库状态后可以发送数据库状态。

  因此,我们可以得出一个结论:在场景中,如果系统依赖组件的功率等,则系统具有自然力量。

  以数据库为例,如果请求对数据的影响是一个新数据,那么唯一的索引可以是解决问题的解决方案。数据库将帮助我们执行独特的检查,并且相同的数据将会不反复解决。

  钉通信记录是唯一的问题,例如数据库的唯一索引。以指甲通信记录为例,在编写数据库中的数据之前,它将确定数据是否已经存在于数据库中。如果不存在,则将最终将数据插入数据库员工插入数据的人的添加。大量同时的交流记录和请求使系统的设计未能失败。在一个附加请求中,(组织ID,工作编号)只能在数据库中标记一个请求,也有唯一的索引(组织ID,工作编号)。因此,我们可以保证,相同的附加请求只会仅修改数据库的状态,也就是说,添加记录。

  如果它们依赖于自然力量等的组件,那么问题很简单,但是实际情况通常更为复杂。在事件中,如果系统依赖的组件无法供电,我们需要使用其他手段来实现电力。

  一种常用的方法是使用分布式锁。有许多实现分布式锁的方法。更常用的缓存分布式锁。

  什么是Java分布式锁中有几段?

  

  他们可以访问Ben由另一个人锁定的资源。

  这些段落告诉我们,锁的本质是对共享资源的共同访问,分布式锁定了分布式系统中相互排斥的资源访问的问题。

  java.util.concurrent.locks软件包提供丰富的锁实现,包括公平的锁/非式锁,阻塞锁/非屏蔽锁,读取和写作锁以及循环锁。

  我们如何意识到分布式锁?

  选项一

  分布式系统中有两个共同的问题:

  1)单点故障问题,也就是说,当锁定锁的应用时,会发生单个点故障时,锁会负担得起;2)网络超时问题,即,当客户端发生在网络超时时,但实际锁成功了,我们不能再纠正

  获取锁。

  为了解决问题1,一个简单的解决方案是引入到期时间,将发生锁的固定时间。当发生单点故障时,可以自动释放它们的锁。

  为了解决问题2,一个简单的解决方案是支持复发。我们配置了一个获得锁定的客户端。身份身份。锁实际上是成功的,并且客户端暂停时,我们可以判断锁定的锁已由客户端持有并恢复成功。

  总而言之,我们给出了基于租赁的分配锁定解决方案。绩效注意事项,使用缓存作为锁定存储介质,使用MVCC(多元转化并发控制)机制来解决对共享资源和共享资源的相互谴责问题的问题附录代码的具体实现。

  分布式锁的一般用途如下

  ●初始化分布式锁的工厂●使用工厂生成分布式锁定实例●使用分布式实例锁定和解锁操作

  该计划简单易用,但是问题也很明显。例如,当锁定的发布时,缓存中的键是无效的,因此有一个错误可以释放其他锁。只要设定锁定时间,问题的机会就足够小。

  我们在文章中借了一张图片在文章中如何在文章中的图片中解释了如何解释方法中的问题。

  想象一下,当职业锁定客户端1在发布锁之前到期时,客户端2将获得锁定。目前,锁定由客户端2持有,但是客户1可能会错误地释放。一个更好的解决方案,我们为每个锁定设置一个身份身份。释放锁时,1)首先检查锁定是否是自己的,2)如果它是我们自己的锁,则释放锁。限制到实现方法,步骤1和步骤2不是原子操作。在步骤1和步骤2之间,如果锁定到期其他客户端,它也将释放其他错误的锁。

  选项II

  在Redis的Lua脚本的帮助下,它可以完美地解决错误的问题以释放他人的锁问题。在正确的实施中,使用Redis的分布式锁的文章的单个实例部分,我们可以得到答案我们想要 - 如何实现分布式锁。

  当我们想获得锁时,我们可以执行以下方法

  当我们要发布锁定时,我们可以执行以下LUA脚本

  第三解决方案

  在对计划1和第二个计划的讨论中,我们反复提到锁定的问题自动释放。

  这是一把双刃剑:

  1)一方面,它解决了持有锁定的客户持有的单点故障的问题。2)另一方面,如果锁定已提前释放,则锁定状态会有错误

  目前,我们可以介绍Watch Dog自动更新机构,我们可以参考如何实现以下重生。

  锁成功后,Redisson将调用Renewexpiration()方法打开Watch Dog线程以自动续订锁定。每1/3次一次,并成功继续下一个续订,未能取消续订操作。

  我们可以查看Redisson Renews.renewexpiration()方法17 ratexpirationAsync()方法是锁定周期的关键操作。当我们输入该方法时,我们可以看到Redisson还使用LUA脚本进行锁定租金:1)确定是否存在锁,2)如果您存在,请重置到期时间。

  计划四

  有了Redisson的自动续订机制,我们不必担心锁的自动释放。但是在这里,我仍然必须面对问题:分布式锁定本身不是分布式的应用程序。REDIS服务器无法正常工作。通常,整个分布式锁无法提供服务。

  此外,我们可以看一下本文中提到的Redlock算法及其在本文中提到的实现。

  Redlock算法不是银炸弹。关于它有很多争论,对此有很多不利的论点:

  如何进行锁定:https://martin.kleppmann.com/2016/02/08/how-do-dostributed-html

  Redlock安全吗?:http://antirez.com/news/101

  马丁·克莱普曼(Martin Kleppmann)和安提雷斯(Antirez)在Redlock上的辩论:https://news.ycombinator.com/item

  参考

  什么是Java Districtd本地?https://redisson.org/glossary/java-distributed-html

  Distitd锁和同步器:https://github.com/redisson/redisson/wiki/8.distributed--nd-synchronizers

  带有redis的距离锁:https://redis.io/topics/distlock?SPM = ATA.21736010.0.0.31F77E3AFS96RZRZ

  附录

  分布式锁

  分布式锁工厂