分布式理论之分布式锁

news2024/10/6 16:27:20

写在前面

在分布式理论之分布式互斥 一文中我们分析了分布式环境中的分布式互斥问题,其中解决该问题有如下的三种方案:

1:集中式算法
2:分布式算法
3:令牌环算法

而本文要分析的分布式锁,就是其中的算法1,接下来我们一起看下。

1:为什么需要分布式锁

当分布式集群中的多个应用实例同时访问某临界资源时,如果是不加以控制,以共享的方式访问,则可能会出现数据一致性的问题,比如当前库存量为3,同时有两个服务要-1,最终应该是1,但如果是二者同时拿到库存量3,然后各自-1后写回,则最终结果就是2,就出现了数据一致性的问题,所以我们这里需要分布式锁。

2:具体方案

目前实现分布式锁,主要有如下3中方案:

1:基于DB的唯一索引实现
2:基于缓存实现
3:基于zookeeper实现

分别来看下。

2.1:基于DB的唯一索引实现

实现思路是,在数据库中创建一张表,除主键外额外创建一个唯一索引字段,当有多个连接同时插入相同值时,只有一个连接可以插入成功,插入成功则代表获取了锁,待执行完毕后将该数据delete掉释则会放锁,这种方式的优点是门槛低,实现简单,缺点如下:

1:单点问题,当DB宕机或不可用,应用也将阻塞不可用
2:死锁问题,客户端异常中断或数据删除失败,将导致锁不能被释放,其他应用将无法获取锁
3:并发量低,DB天生不支持高并发,所以这里也有此问题

2.2:基于缓存实现

这里我们一般都是基于Redis来使用,因为其具有支持高并发访问的特点,具体实现方法参考这篇文章 ,优点是并发性能好,缺点如下:

1:锁等待,当获取锁线程异常终止,或者释放锁失败的话则只能等待锁过期自动删除
2:锁丢失,当锁所在实例宕机,则可能造成锁丢失,即使有主从,如果是数据还没有同步到从节点,同样会发生锁丢失

对于1我们基于zookeeper的方案可以解决,对于2则可以考虑使用redlock,redlock是要求在一组Redis实例分别执行setnx操作,只有超过半数设置成功才算加锁成功,同样的,要释放锁的话,需要在所有的实例上都执行del key操作释放锁,但是这种方式需要在多实例分别操作,会影响到并发性,但是可靠性更高。

2.3:基于zookeeper实现

zookeeper实现分布式锁的原理是同一个节点只会允许一个线程创建成功,具体参考这篇文章 。缺点是需要频繁的删除添加节点,触发watch,且并发性要弱于基于缓存的方案,但是因为是集群部署,所以可靠性好。

2.4:方案对比

在这里插入图片描述

在这里插入图片描述

写在后面

参考文章列表:

zookeeper之基本使用及实现分布式锁 。

redis之作为分布式锁使用 。

Redlock:Redis分布式锁最牛逼的实现 。

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

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

相关文章

折腾了我一周,原来Netty网络编程就是这么个破玩意儿!!!

1、阻塞 阻塞模式下,相关方法都会导致线程暂停 ServerSocketChannel.accept 会在没有连接建立时让线程暂停SocketChannel.read 会在通道中没有数据可读时让线程暂停阻塞的表现其实就是线程暂停了,暂停期间不会占用 cpu,但线程相当于闲置 单线…

flowable学习笔记(四):动态多实例

1.定义流程模板 【测试用户任务多实例】任务节点配置了以下属性: 集合(多实例):userList。这个创建流程实例时入参需要加上这个参数。 元素变量(多实例):user。工作流创建多实例时会将集合(多实例)的值拆分成元素变量(多实例),这个…

Git复习,GitHub\Gitee的使用,IDEA集成Git

今天想把自己的课设上传到GitHub,因为长久不用,Git的命令忘得差不多了,所以今天把Git重新学一遍。 文章目录Git的介绍Git的安装Git的常用命令工作机制常用命令用户签名初始化本地库查看本地库状态添加暂存区提交本地库查看引用日志信息修改文…

Python常用函数笔记汇总2

1.分组汇总groupby 2.计算空值 # py计算空值 data.isnull().sum(axis0) data.notnull().sum(axis0)# py去重计数 data_op[id_num_op].value_counts().size data_op[id_num_op].size3.保留两位小数 # predict_proba保留两位小数 gnb GaussianNB() pre gnb.fit(X_train,y_tr…

pytest-日志配置

如果想要在run测试用例时,打印出由python的logging的日志,可以在pytest中进行相应的配置 pytest可以将日志输出到控制台或者文件中,分别对应不同的配置项 pytest的日志配置文件主要在pytest.ini文件中进行配置,包括配置日志的格式…

ARM64内存虚拟化分析(5)内存布局更新

1 添加MR 创建的MR需要通过函数memory_region_add_subregion()添加到系统中,提交MR,并最终往KVM提交内存的变化。 过程如下: 将mr设置为subregion的container;设置subregion在虚拟机中的物理地址;调用memory_region_t…

FOHEART H1数据手套_Unity3D SDK开发

本教程介绍使用FOHEART H1数据手套在Unity3D中,显示每段骨骼的位置与旋转信息。 需要准备的软硬件: 1、FOHEART H1数据手套 2、MotionVenus客户端 3、Unity3D软件 4、开发包MotionVenus_U3DPlugin_v2.0_H1GloveDev_SDKTest.unitypackage 1、连接数…

HFSS学习笔记

以下所有操作,都是基于2022版本的HFSS。一、HFSS solution模式选择位置:HFSS-Solution type类型表格。二、单位设置位置:Modeler-Units点击后,通常选用单位为:mm三、绘制物体点击红圈1的draw,右侧有些形状可…

MCU-51:单片机实时时钟

目录一、什么是时钟1.1 实时时钟1.2 时序二、DS1302实时时钟2.1 DS1302介绍2.2 引脚定义和应用电路三、代码演示3.1 数字时钟3.2 DS1302可调时钟注意:一定要看一、什么是时钟 1.1 实时时钟 real time clock,真实时间,就是所谓的xx年x月x日x…

我的统计学学习笔记(持续更新)

目录数据:变量和观测统计学描述统计数据的收集数据的可视化数据的规律性特征统计推断参数估计假设检验贝叶斯统计基础知识:概率论数据:变量和观测 变量(column)、观测(row)、测量(assign number to observation)。 统计学 描述统计 数据…

YOLO-V5 系列算法和代码解析(四)—— 网络结构

文章目录辅助工具网络配置文件网络构建网络推理绘制网络结构辅助工具 借助辅助工具可视化网络结构,达到辅助阅读代码,进而辅助手动绘制结构清晰的网络结构,最终理解整个网络架构的目的,为深入学习【yolo-v5】提供有效的保障。 ten…

阿里妈妈内容风控模型预估引擎的探索和建设

作者:徐雄飞、金禄旸、滑庆波、李治 内容作为营销的重要载体,能够促进信息的交流和传播。在营销场景中,广告高曝光的特性放大了风险外漏带来的一系列问题,因此对内容的风控审核就显得至关重要。本文将为大家分享阿里妈妈内容风控模…

DOM节点操作

节点操作 改变元素节点中的内容可以使用两个相关属性:innerHTML innerText 注意字符串不能换行 innerHTML属性能以HTML语法设置节点中的内容 innerText属性只能以纯文本的形式设置节点中的内容 节点创建 document.createElement()方法用于创建一个指定tagname…

android studio编译慢

前言 android studio编译慢一直就是一个问题,很久以前使用eclipse,编译速度很快,在还没开始正式工作的时候就开始使用android studio,那时候还是0.8 很原始,主要那时候还没开始工作,所以编译快慢没感觉&am…

TikTok Shop跨境服务市场上线;俄罗斯速卖通发布延误通知

让我们一起来看看今日都有哪些新鲜事吧!01 TikTok Shop跨境服务市场上线 12月28日消息,服务商是助力商家在TikTok Shop成长非常重要的合作伙伴,TikTok Shop希望通过上线服务市场帮助商家快速了解服务商,筛选符合自身需求的服务商…

【JavaSE成神之路】Java面向对象(上)

哈喽,我是兔哥呀,今天就让我们继续这个JavaSE成神之路! 这一节啊,咱们要学习的内容是Java的面向对象。 首先我们回顾一下,之前的章节我们学到了哪些东西。 我们学会了写一个类,然后里面弄一个main方法&am…

layer2 实现方式之状态通道

状态通道也算是一种比较热门的扩容方案,状态通道解决方案通过将链下交互和链上清算隔离开,能够在保障一定程度的非中心化和资产安全性的同时,实现速度更快、费用更低的交易。状态通道作为一种链下扩容方案,从一般到特殊分为通用状…

时光飞逝,博客两周年啦

原文链接:时光飞逝,博客两周年啦 博客自 2020年12月10日 运营以来,已经成功走过两年啦(差点成为两年半的博主)。 在这两年中,曾替无数网友解答了各种关于建站的疑难杂症,此处略过 30000 字。 …

linux系统动态库的连接

前言:在应用程序开发过程中,难免会用到第三方库,有的是开源的第三方库,有的是不开源的,还有的是自己写的库。上篇文章总结了应用程序调用静态库《linux中静态库编译与使用》,本文总结了几种在应用程序中快速…

八、esp8266建立基本网络服务器

1、网络服务器 (1)网络服务器有很多类型,它们功能十分丰富。通常承担网络服务器工作的设备都是运算能力比较强大的电脑。 (2)ESP8266虽然也能实现网络服务器的一些功能,但是毕竟它的运算能力是无法与那些昂贵的服务器电脑相比较,因此ESP826…