当前位置: 首页 > news >正文

微服务 - 分布式锁的实现与处理策略

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

分布式锁的实现与处理策略

      • 分布式锁的实现与处理策略
        • 引言
        • 一、分布式锁的实现方式
        • 二、释放锁时宕机的处理
        • 三、业务未执行完锁过期的处理
        • 四、总结

分布式锁的实现与处理策略

引言

分布式系统中的分布式锁用于在多个节点之间协调对共享资源的访问。由于这些系统中的节点是独立且可能处于不同的物理位置,分布式锁需要解决许多问题,如锁的实现、宕机恢复以及锁过期等。本文将探讨分布式锁的实现方式、宕机处理策略以及锁过期的应对方法。

一、分布式锁的实现方式

分布式锁的实现通常依赖于分布式存储系统,如 Redis、Zookeeper 和 Etcd 等。以下是几种常见的分布式锁实现方式:

  1. 基于 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 主从复制延迟等问题。
  2. 基于 Zookeeper 的分布式锁

    Zookeeper 是一个分布式协调服务,它提供了分布式锁的可靠实现。Zookeeper 使用临时节点和顺序节点来实现分布式锁:

    • 加锁
      客户端在 Zookeeper 中创建一个临时顺序节点,节点名包含序号。客户端检查自己创建的节点是否是最小序号的节点,如果是,则获得锁。

    • 解锁
      客户端删除其创建的节点,Zookeeper 会通知等待的客户端,新的锁持有者可以获得锁。

    优点

    • 高可靠性,Zookeeper 本身是分布式的且支持高可用性。
    • 能够处理节点宕机和网络分区问题。

    缺点

    • 实现较复杂,性能不如 Redis。
    • 需要 Zookeeper 集群支持。
  3. 基于 Etcd 的分布式锁

    Etcd 是一个分布式键值存储系统,类似于 Zookeeper,也可以用来实现分布式锁:

    • 加锁
      使用 Compare-And-Swap (CAS) 操作尝试设置一个键值对,并设置一个过期时间。

    • 解锁
      客户端删除之前设置的键值对。

    优点

    • 高可用性和一致性。
    • 提供了简单的 API 和易于实现的锁机制。

    缺点

    • 性能和实现复杂度介于 Redis 和 Zookeeper 之间。
二、释放锁时宕机的处理

在分布式系统中,处理节点宕机时的锁释放是一个关键问题。以下是几种常见的处理策略:

  1. 锁的自动过期
    通过设置锁的过期时间(TTL),即使节点宕机,锁也会在一定时间后自动释放。例如,Redis 分布式锁利用键的过期时间处理宕机问题。如果客户端宕机,Redis 会在 TTL 过期后自动删除锁,从而允许其他节点获得锁。

  2. 心跳机制
    在一些实现中,持有锁的客户端定期发送心跳信号以续期锁。这种机制可以防止在持有锁的节点宕机时,锁被过早地释放。心跳机制可以与锁的自动过期机制结合使用,以确保在心跳丢失或网络分区时,锁会在适当时间内被释放。

  3. 重新选举机制
    在使用 Zookeeper 或 Etcd 时,客户端可以在宕机后通过重新选举机制来恢复锁状态。这些系统会通知其他节点锁的状态变化,从而允许新的节点接管锁的控制。

三、业务未执行完锁过期的处理

在分布式系统中,锁过期可能会导致业务未完成的问题。以下是一些处理策略:

  1. 增加锁的超时时间
    设定合理的锁超时时间,确保业务能够在锁的有效期内完成。如果业务的执行时间不可预知,可以考虑使用更长的超时时间,并结合心跳机制来动态延长锁的持有时间。

  2. 业务重试机制
    在业务逻辑中,加入重试机制。如果业务在锁超期后发现操作未完成,可以重新请求锁并重试操作。结合幂等性设计,可以确保业务重试不会造成副作用。

  3. 使用分布式事务
    对于涉及多个步骤的业务逻辑,可以考虑使用分布式事务框架(如 Saga 模式),确保业务的各个步骤能够在锁过期或其他异常情况下得到处理和恢复。

  4. 监控与告警
    实施监控和告警机制,及时检测锁的过期情况和业务执行状态,能够帮助运维人员及时介入并处理潜在的问题。

四、总结

分布式锁的实现涉及选择合适的技术和策略来解决锁的可靠性、宕机恢复以及锁过期问题。通过了解 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 均值聚类(最常用的聚类方法之一&#xff0…...

预警先行,弯道哨兵让行车更安全

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

预约咨询小程序搭建开发,uniapp前端,PHP语言开发

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

极速文件预览!轻松部署 kkFileView 于 Docker 中!

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

某验九宫格分类识别

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

未来展望:观测云技术的发展与企业业务的融合

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

day6JS-DOM(文档对象模型)

DOM树 DOM 操作 1. 获取元素 1.1 根据id名获取元素 document.getElementById("id名"); 案例&#xff1a; <body><div id"box">div盒子</div><h1>一级标题</h1><script>console.log(document.getElementById(&quo…...

MySQL列表分区分区表

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

qt打包程序方法(非常好用)

1.下载 Index of /official_releases/qt-installer-framework/4.6.1 bi...

IP地址管理:优化网络布局与提升效率

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

老古董Lisp实用主义入门教程(5):好奇先生用Lisp探索Lisp

鲁莽先生什么都不管 鲁莽先生打开电脑&#xff0c;安装一堆东西&#xff0c;噼里啪啦敲了一堆代码&#xff0c;叽里呱啦说了一堆话&#xff0c;然后累了就回家睡觉了。 这可把好奇先生的兴趣勾起来&#xff0c;他怎么也睡不着。好奇先生打开电脑&#xff0c;看了看鲁莽先生留…...

linux文件——用户缓冲区——概念深度理解、IO模拟实现

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

Selenium模拟鼠标滚动页面:实现自动化测试中的页面交互

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

Eureka原理与实践:构建高效的微服务架构

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

OpenJDK 和 OracleJDK 的区别、下载方式

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

arthas源码刨析:arthas-core (2)

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

【分享】格力手机色界G0245D 刷REC、root、 救砖、第三方rom教程和资源

开门见山 帮别人弄了一台 格力G0245D&#xff0c;把找到的资源和教程分享一下 教程 这个写的很详细了格力手机色界G0245D-Root-最简指南 不过教程里刷rec这一步漏了加上电源键&#xff0c;加上就行了。 附加参考&#xff1a;格力手机2刷机 格力手机二代刷机 GREE G0215D刷机…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...

CppCon 2015 学习:Time Programming Fundamentals

Civil Time 公历时间 特点&#xff1a; 共 6 个字段&#xff1a; Year&#xff08;年&#xff09;Month&#xff08;月&#xff09;Day&#xff08;日&#xff09;Hour&#xff08;小时&#xff09;Minute&#xff08;分钟&#xff09;Second&#xff08;秒&#xff09; 表示…...