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

klock 分布式锁重大更新

klock简介

基于redis的分布式锁spring-boot starter组件,使得项目拥有分布式锁能力变得异常简单,支持spring boot,和spirng mvc等spring相关项目。基于注解驱动,支持spring Spel,方便的定义锁的key的粒度

本次更新内容

本次更新主要新增了【锁等待超时】和【锁持有超时】的处理策略,这两个参数是为了解决分布式锁的死锁问题而设置的,而增加这两个策略是为了在极端情况下锁失效时业务能够感知并处理。

因为基于redis实现分布式锁,如果使用不当,会在以下场景下遇到锁超时的问题: 锁超时处理逻辑

加锁超时处理策略(LockTimeoutStrategy):

  • NO_OPERATION 不做处理,继续执行业务逻辑
  • FAIL_FAST 快速失败,会抛出KlockTimeoutException
  • KEEP_ACQUIRE 阻塞等待,一直阻塞,直到获得锁,但在太多的尝试后,会停止获取锁并报错,此时很有可能是发生了死锁。
  • 自定义(customLockTimeoutStrategy) 需指定自定义处理的方法的方法名,并保持入参一致,指定自定义处理方法后,会覆盖上述三种策略,且会拦截业务逻辑的运行。

释放锁时超时处理策略(ReleaseTimeoutStrategy):

  • NO_OPERATION 不做处理,继续执行业务逻辑
  • FAIL_FAST 快速失败,会抛出KlockTimeoutException
  • 自定义(customReleaseTimeoutStrategy) 需指定自定义处理的方法的方法名,并保持入参一致,指定自定义处理方法后,会覆盖上述两种策略, 执行自定义处理方法时,业务逻辑已经执行完毕,会在方法返回前和throw异常前执行。

本次更新内容如何使用?

  @Klock(name="foo-service", waitTime=2, customLockTimeoutStrategy = "customLockTimeout")
    public String foo4(String foo, String bar) {
        try {
            TimeUnit.SECONDS.sleep(2);
            logger.info("acquire lock");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return "foo4";
    }

    private String customLockTimeout(String foo, String bar) {

        logger.info("customLockTimeout foo: " + foo + " bar: " + bar);
        return "custom foo: " + foo + " bar: " + bar;
    }

如上代码,在锁获取超时时,会调用用户自定义的方法。这个和分布式事务TCC的用法类似,在使用自定义处理策略时,需要提供一个方法入参和被加锁的方法一直的方法。

后记

本次更新内容,在测试模块中都已集成相关场景的使用用例,欢迎测试体验

相关文章:

  • python 基础问题,包括语法等
  • Spark- SparkSQL中 Row.getLong 出现NullPointerException错误的处理方法
  • 原子性问题的解决思路--锁
  • Day1 BFS算法的学习和训练
  • 使用DataWorks来调度AnalyticDB任务
  • 好程序员分享ApacheSpark常见的三大误解
  • 2017-12-05 JavaScript实现ZLOGO子集: 前进+转向
  • 阿里云性能测试 PTS 上手体验
  • FastDfs 分布式文件系统 安装与配置 (实测成功)
  • 读JVM(深入理解Java虚拟机)笔记(一)
  • Vue之坑
  • flask 第七章 简陋版智能玩具 +MongoDB初识和基本操作
  • 4-1 requests库的安装
  • 学起来:Flutter将支持桌面应用开发
  • 基于binlog方式搭建MySQL主从
  • 「译」Node.js Streams 基础
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 10个确保微服务与容器安全的最佳实践
  • django开发-定时任务的使用
  • eclipse的离线汉化
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • JAVA_NIO系列——Channel和Buffer详解
  • mac修复ab及siege安装
  • Meteor的表单提交:Form
  • Protobuf3语言指南
  • SpiderData 2019年2月23日 DApp数据排行榜
  • SpringBoot 实战 (三) | 配置文件详解
  • Zepto.js源码学习之二
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 记录:CentOS7.2配置LNMP环境记录
  • 新书推荐|Windows黑客编程技术详解
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #100天计划# 2013年9月29日
  • #ubuntu# #git# repository git config --global --add safe.directory
  • $jQuery 重写Alert样式方法
  • $NOIp2018$劝退记
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (Java数据结构)ArrayList
  • (Python第六天)文件处理
  • (第27天)Oracle 数据泵转换分区表
  • (十八)三元表达式和列表解析
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (转) RFS+AutoItLibrary测试web对话框
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .net中我喜欢的两种验证码
  • .so文件(linux系统)
  • @Autowired 与@Resource的区别
  • @TableLogic注解说明,以及对增删改查的影响
  • [2016.7 day.5] T2
  • [20190113]四校联考
  • [acm算法学习] 后缀数组SA
  • [BZOJ 2142]礼物(扩展Lucas定理)
  • [C#C++]类CLASS