微服务 - 分布式锁的实现与处理策略
作者:
逍遥Sean
简介:一个主修Java的Web网站\游戏服务器后端开发者
主页:https://blog.csdn.net/Ureliable
觉得博主文章不错的话,可以三连支持一下~ 如有疑问和建议,请私信或评论留言!
分布式锁的实现与处理策略
- 分布式锁的实现与处理策略
- 引言
- 一、分布式锁的实现方式
- 二、释放锁时宕机的处理
- 三、业务未执行完锁过期的处理
- 四、总结
分布式锁的实现与处理策略
引言
分布式系统中的分布式锁用于在多个节点之间协调对共享资源的访问。由于这些系统中的节点是独立且可能处于不同的物理位置,分布式锁需要解决许多问题,如锁的实现、宕机恢复以及锁过期等。本文将探讨分布式锁的实现方式、宕机处理策略以及锁过期的应对方法。
一、分布式锁的实现方式
分布式锁的实现通常依赖于分布式存储系统,如 Redis、Zookeeper 和 Etcd 等。以下是几种常见的分布式锁实现方式:
-
基于 Redis 的分布式锁
Redis 是一种内存数据存储系统,它的高性能使其成为实现分布式锁的常见选择。Redis 分布式锁通常利用
SETNX
命令(SET if Not eXists)来实现:-
加锁:
SET lock_key unique_lock_value NX PX 30000
这条命令会尝试设置一个键
lock_key
,如果该键不存在(即锁没有被其他客户端持有),则设置成功,并且设置一个过期时间(例如 30 秒)。unique_lock_value
是一个唯一标识符,用于防止锁的重入。 -
解锁:
解锁时,需要确保只有持有锁的客户端才能删除锁:if redis.get(lock_key) == unique_lock_value:redis.delete(lock_key)
优点:
- 实现简单,性能高。
- Redis 的过期机制自动处理锁过期问题。
缺点:
- 需要处理网络分区、Redis 主从复制延迟等问题。
-
-
基于 Zookeeper 的分布式锁
Zookeeper 是一个分布式协调服务,它提供了分布式锁的可靠实现。Zookeeper 使用临时节点和顺序节点来实现分布式锁:
-
加锁:
客户端在 Zookeeper 中创建一个临时顺序节点,节点名包含序号。客户端检查自己创建的节点是否是最小序号的节点,如果是,则获得锁。 -
解锁:
客户端删除其创建的节点,Zookeeper 会通知等待的客户端,新的锁持有者可以获得锁。
优点:
- 高可靠性,Zookeeper 本身是分布式的且支持高可用性。
- 能够处理节点宕机和网络分区问题。
缺点:
- 实现较复杂,性能不如 Redis。
- 需要 Zookeeper 集群支持。
-
-
基于 Etcd 的分布式锁
Etcd 是一个分布式键值存储系统,类似于 Zookeeper,也可以用来实现分布式锁:
-
加锁:
使用Compare-And-Swap
(CAS) 操作尝试设置一个键值对,并设置一个过期时间。 -
解锁:
客户端删除之前设置的键值对。
优点:
- 高可用性和一致性。
- 提供了简单的 API 和易于实现的锁机制。
缺点:
- 性能和实现复杂度介于 Redis 和 Zookeeper 之间。
-
二、释放锁时宕机的处理
在分布式系统中,处理节点宕机时的锁释放是一个关键问题。以下是几种常见的处理策略:
-
锁的自动过期:
通过设置锁的过期时间(TTL),即使节点宕机,锁也会在一定时间后自动释放。例如,Redis 分布式锁利用键的过期时间处理宕机问题。如果客户端宕机,Redis 会在 TTL 过期后自动删除锁,从而允许其他节点获得锁。 -
心跳机制:
在一些实现中,持有锁的客户端定期发送心跳信号以续期锁。这种机制可以防止在持有锁的节点宕机时,锁被过早地释放。心跳机制可以与锁的自动过期机制结合使用,以确保在心跳丢失或网络分区时,锁会在适当时间内被释放。 -
重新选举机制:
在使用 Zookeeper 或 Etcd 时,客户端可以在宕机后通过重新选举机制来恢复锁状态。这些系统会通知其他节点锁的状态变化,从而允许新的节点接管锁的控制。
三、业务未执行完锁过期的处理
在分布式系统中,锁过期可能会导致业务未完成的问题。以下是一些处理策略:
-
增加锁的超时时间:
设定合理的锁超时时间,确保业务能够在锁的有效期内完成。如果业务的执行时间不可预知,可以考虑使用更长的超时时间,并结合心跳机制来动态延长锁的持有时间。 -
业务重试机制:
在业务逻辑中,加入重试机制。如果业务在锁超期后发现操作未完成,可以重新请求锁并重试操作。结合幂等性设计,可以确保业务重试不会造成副作用。 -
使用分布式事务:
对于涉及多个步骤的业务逻辑,可以考虑使用分布式事务框架(如 Saga 模式),确保业务的各个步骤能够在锁过期或其他异常情况下得到处理和恢复。 -
监控与告警:
实施监控和告警机制,及时检测锁的过期情况和业务执行状态,能够帮助运维人员及时介入并处理潜在的问题。
四、总结
分布式锁的实现涉及选择合适的技术和策略来解决锁的可靠性、宕机恢复以及锁过期问题。通过了解 Redis、Zookeeper 和 Etcd 等分布式锁实现的优缺点,结合具体业务场景,可以设计出高效、可靠的分布式锁机制。在实践中,合理配置锁的过期时间、实施心跳机制、设计重试逻辑和监控告警,将有效地应对分布式锁带来的挑战。
相关文章:

微服务 - 分布式锁的实现与处理策略
作者:逍遥Sean 简介:一个主修Java的Web网站\游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有疑问和建议,请私信或评论留言! 分布式锁的实现与处理…...

Catf1ag CTF Web(九)
前言 Catf1agCTF 是一个面向所有CTF(Capture The Flag)爱好者的综合训练平台,尤其适合新手学习和提升技能 。该平台由catf1ag团队打造,拥有超过200个原创题目,题目设计注重知识点的掌握,旨在帮助新手掌握C…...

QT QFileDialog 类
QFileDialog 类 QFileDialog 类 QFileDialog 是 Qt 库中的一个类,用于提供文件选择对话框, 允许用户选择文件或目录。QFileDialog 提供了多种静态方法和实例方法, 用于创建和配置文件对话框,并获取用户选择的文件或目录。 QObje…...

了解 K-Means 聚类的工作原理(详细指南)
一、说明 K-means 的目标是将一组观测值划分为 k 个聚类,每个观测值分配给均值(聚类中心或质心)最接近的聚类,从而充当该聚类的代表。 在本文中,我们将全面介绍 k 均值聚类(最常用的聚类方法之一࿰…...

预警先行,弯道哨兵让行车更安全
预警先行,弯道哨兵让行车更安全”这句话深刻体现了现代交通安全理念中预防为主、科技赋能的重要性。在道路交通中,尤其是复杂多变的弯道区域,交通事故的发生率往往较高,因此,采取有效的预警措施和引入先进的交通辅助设…...

预约咨询小程序搭建开发,uniapp前端,PHP语言开发
目录 前言: 一、预约小程序搭建功能介绍 二、示例代码片段 前言: 预约咨询小程序适合需付费咨询和交流的场景:比如讲师,摄影,婚庆,美发,律师,心理等等支持商家入驻支持视频、图文、线下、电话等方式在线支付咨询。 一、预约小程…...

极速文件预览!轻松部署 kkFileView 于 Docker 中!
大家好,这几天闲的难受,决定给自己找点事做。博主的项目中有个文件预览的小需求,原有方案是想将文件转换成 PDF 进行预览。本着能借鉴就绝对不自己写的原则。今天就让我们简单试用一下 kkFileView 文件预览服务,一起探索它的强大功…...

某验九宫格分类识别
注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 九宫格分类如下 这种就是最简单的分类识别了,用迁移学习resnet训练即可,下面来看成品 训练代码查看往期文章中就有,部分代码如下: DEVICE = torch.device(…...

未来展望:观测云技术的发展与企业业务的融合
随着技术的不断进步,观测云作为企业数据监控和分析的关键工具,其发展与企业业务的融合趋势显得尤为重要。在未来,观测云技术将如何演进,以及它将如何更深层次地与企业业务相融合,是值得我们深入探讨的问题。 首先&…...

day6JS-DOM(文档对象模型)
DOM树 DOM 操作 1. 获取元素 1.1 根据id名获取元素 document.getElementById("id名"); 案例: <body><div id"box">div盒子</div><h1>一级标题</h1><script>console.log(document.getElementById(&quo…...

MySQL列表分区分区表
什么是列表分区分区表? 列表分区是一种根据某个列的离散值将表数据分割成多个分区的分区方式。在列表分区中,每个分区都有自己的离散值集合,当插入数据时,MySQL会根据指定的列值将数据分配到相应的分区中。这种分区方式可以使得表…...

qt打包程序方法(非常好用)
1.下载 Index of /official_releases/qt-installer-framework/4.6.1 bi...

IP地址管理:优化网络布局与提升效率
在日益复杂的网络环境中,IP地址管理成为了网络管理员日常工作中不可或缺的一部分。有效的IP地址管理不仅能够优化网络布局,提升网络运行效率,还能确保网络安全和稳定性。本文将探讨IP地址管理的重要性、实施策略以及最佳实践。 一、IP地址管…...

老古董Lisp实用主义入门教程(5):好奇先生用Lisp探索Lisp
鲁莽先生什么都不管 鲁莽先生打开电脑,安装一堆东西,噼里啪啦敲了一堆代码,叽里呱啦说了一堆话,然后累了就回家睡觉了。 这可把好奇先生的兴趣勾起来,他怎么也睡不着。好奇先生打开电脑,看了看鲁莽先生留…...

linux文件——用户缓冲区——概念深度理解、IO模拟实现
前言:本篇文章主要讲解文件缓冲区。 讲解的方式是通过抛出问题, 然后通过分析问题, 将缓冲区的概念与原理一步一步地讲解。同时, 本节内容在最后一部分还会带友友们模拟实现一下c语言的printf, fprintf接口,…...

Selenium模拟鼠标滚动页面:实现自动化测试中的页面交互
Selenium模拟鼠标滚动页面:实现自动化测试中的页面交互 在进行网页自动化测试时,经常需要模拟用户的滚动行为来加载更多内容或触发页面上的某些交互。Selenium WebDriver提供了强大的工具来模拟这些用户行为,包括鼠标滚动。本文将介绍如何使…...

Eureka原理与实践:构建高效的微服务架构
Eureka原理与实践:构建高效的微服务架构 Eureka的核心原理Eureka Server:服务注册中心Eureka Client:服务提供者与服务消费者 Eureka的实践应用集成Eureka到Spring Cloud项目中创建Eureka Server创建Eureka Client(服务提供者&…...

OpenJDK 和 OracleJDK 的区别、下载方式
OpenJDK 和 OracleJDK 都是 Java 开发套件 (JDK),用于开发和运行 Java 应用程序。它们之间的主要区别如下: 许可证和使用限制: OpenJDK:由 OpenJDK 社区开发和维护,基于 GPL v2 with Classpath Exception 许可证&#…...

arthas源码刨析:arthas-core (2)
文章目录 attach JVMagent**ArthasBootstrap** arthas-core的启动可以从上一篇做参考 参考 pom,即启动是调用的 Arthas 的 main 方法 attach JVM JVM提供了 Java Attach 功能,能够让客户端与目标JVM进行通讯从而获取JVM运行时的数据,甚至可以…...

【分享】格力手机色界G0245D 刷REC、root、 救砖、第三方rom教程和资源
开门见山 帮别人弄了一台 格力G0245D,把找到的资源和教程分享一下 教程 这个写的很详细了格力手机色界G0245D-Root-最简指南 不过教程里刷rec这一步漏了加上电源键,加上就行了。 附加参考:格力手机2刷机 格力手机二代刷机 GREE G0215D刷机…...

开学必备清单来啦!大学好物合集推荐!每一个都能帮你提升幸福感
随着开学季的到来,好多学生都在忙着准备各类学习与生活必需品,以迎接新的大学生活到来。以下是一些开学季必备的好物推荐,每一个都很实用,可以帮你提升学习和生活的幸福感! 1、西圣电容笔 一句话推荐:公认…...

已解决:javax.xml.transform.TransformerFactoryConfigurationError 异常的正确解决方法,亲测有效!!!
1. 问题描述 javax.xml.transform.TransformerFactoryConfigurationError 是在使用 Java 的 XML 处理库时,配置 TransformerFactory 出错时抛出的异常。通常,这个异常发生在应用程序试图创建一个 TransformerFactory 实例时,由于无法找到合适…...

商品价格与优惠信息在API返回值中的位置
在API返回值中,商品价格与优惠信息的具体位置可能因不同的电商平台和API设计而有所不同。然而,一般来说,这些信息会以结构化的方式呈现,通常包含在一个包含多个字段的JSON对象或XML文档中。以下是根据多个电商平台(如阿…...

Oracle Index Partition索引分区的管理
Oracle索引分区的管理是数据库管理中的重要任务之一,它涉及索引的创建、维护、重建以及优化等多个方面。以下是对Oracle索引分区管理的详细解析: 一、索引分区的概念 索引分区(Partitioned Index)是针对分区表而言的,…...

统信UOS系统访问windows共享目录
问题背景 当我们使用UOS系统的时候,想要访问windows系统的一些资料并将其拷贝下来使用的话,应该怎么操作呢?这个需求是可以实现的,统信UOS系统是基于Linux系统开发的,Linux系统和windows系统之间可以通过SMB协议来共享…...

单一职责原则与REST API设计:如何定义清晰的资源与职责
在软件设计中,单一职责原则(Single Responsibility Principle, SRP)和 REST API 设计是两个重要的概念。单一职责原则是一种设计原则,它强调一个类或模块应当只有一个单一的职责,这有助于提高系统的可维护性和扩展性。…...

JAVA IO模型
我们在平常开发过程中接触最多的就是 磁盘 IO(读写文件) 和 网络 IO(网络请求和响应)。从应用程序的视角来看的话,我们的应用程序对操作系统的内核发起 IO 调用(系统调用),操作系统负…...

《C/C++实战专栏》介绍
🚀 前言 本文是《C/C实战专栏》专栏的说明贴(点击链接,跳转到专栏主页,欢迎订阅,持续更新…)。 专栏介绍:以多年的开发实战为基础,总结并讲解一些的C/C基础与项目实战进阶内容&…...

前端跨域2
前端跨域2 前端跨域解决方案(11种方案) 1.JSONP跨域解决方案的底层原理 script、img、link、iframe...<script src"https://cdn.bootcss.com/jquery/3.4.1/core.js"></script>// 这个就是因为script标签没有跨域限制࿰…...

electron仿微信,新建贴合窗口
说明 在写electron项目时,只有一个主窗口不足以满足需求,我们通常还会打开很多个窗口。 怎么打开一个子窗口像微信的聊天界面一样,全贴合在一起,看起来像一个整体呢: 分析 这个窗口有点像element ui中的抽屉(drawe…...