[框架系列]-[通用lock框架] 介绍

这篇具有很好参考价值的文章主要介绍了[框架系列]-[通用lock框架] 介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一:简介

二:框架优点

1.统一的调用api

2.统一的lock句柄获取api

3.多厂商实现切换

4.多厂商不同类型lock同时使用

5.多厂商实现扩展

6.lock增强

(1)本地lock预锁

(2)事务感知

7.注解式lock支持

(1)提供的lock注解

(2)业务策略及自定义策略

8.方法级定制以及全局定制能力


一:简介

lock框架是解决java lock领域的一种通用框架,基于spring boot框架starter集成机制,可以通过简单的依赖配置,快速实现集成,此篇主要介绍设计思路,不关心的直接具体见通用lock框架集成及具体配置使用-CSDN博客

二:框架优点

1.统一的调用api

基于java 的Lock接口作为标准,可以使用本地的ReentantLock,ReentrantReadWriteLock.WriteLock以及Redission相关的RedissonLock,RedissonReadLock 等接口的实现

public interface Lock {

    void lock();

     

    void lockInterruptibly() throws InterruptedException;

     

    boolean tryLock();

     

    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

   

    void unlock();

   

    Condition newCondition();

}

2.统一的lock句柄获取api

基于Spring的LockRegistry标准,可以使用包括Spring自带的RedisLockRegistry以及其他实现此标准的LockRegistry

@FunctionalInterface

public interface LockRegistry {

    /**

     * Obtains the lock associated with the parameter object.

     * @param lockKey The object with which the lock is associated.

     * @return The associated lock.

     */

    Lock obtain(Object lockKey);

}

LockRegistry obtain返回的Lock为java的Lock标准

3.多厂商实现切换

标准的高度统一,为灵活的切换不同的lock实现提供的支持。框架预置了如下实现类型的定义

/**

    * lock实现厂商类型

    */

   public enum LockImplementer {

       /**

        * 本地JVM实现

        */

       JVM,

       /**

        * redis实现

        */

       REDIS,

       /**

        * zookeeper实现

        */

       ZOOKEEPER,

       /**

        * etcd实现

        */

       ETCD,

       /**

        * mysql实现

        */

       MYSQL,

       ;

   }

其中本地实现以及redission实现框架已经支持

4.多厂商不同类型lock同时使用

/**

 * Created by suyouliang

 * Content :锁类型

 */

public enum LockType {

    /**

     * 可重入锁

     */

    Reentrant("reentrant"),

    /**

     * 公平锁

     */

    Fair("fair"),

    /**

     * 读锁

     */

    Read("read"),

    /**

     * 写锁

     */

    Write("write"),

    /**

     * 自旋锁

     */

    Spin("spin"),

    ;

}

配置类型

配置名

作用域

LockImplementer
implementer
全局及注解
LockType
lockType
注解
5.多厂商实现扩展

框架允许基于Spring的标准LockRegistry扩展自定义的LockRegistry实现,当然Lock同样可以,通用Lock框架也基于这两个标准进行扩展的,并定义了本框架的扩展标准,实现一下以下接口后,仅需通过少量配置即直接可在框架中生效,而无需更改逻辑调用代码

public interface LockRegistryFactory {

    LockRegistry getLockRegistry(LockConfig.LockImplementer lockImplementer, boolean supportTransaction, boolean withLocalCache);

    LockFactory getLockFactory(LockConfig.LockImplementer lockImplementer, boolean supportTransaction, boolean withLocalCache);

}

public interface LockFactory {

    Lock getLock(String type, String lockKey);

    LockScopeType getScopeType();

}

6.lock增强

在java Lock定义的能力之外,框架提供了两个增强能力

(1)本地lock预锁

lock的上锁会先在本地进行预上锁,本地上锁成功才会真正调用实际的分布式锁。如果本地失败则直接快速失败

(2)事务感知

基于注解事务,内部使用lock可能会发生锁释放了但是当前事务还没提交的情况,此时lock将会失效。lock框架可感知上下文的事务,并提供了此情况发生时相应的策略

**

 * 当lock存在于事务上下文中的策略

 */

public enum LockTransactionStrategy {

    /**

     * 生效,打warming日志(仅开启supportTransaction生效)

     */

    WARMING,

    /**

     * 禁止,会抛异常阻断业务逻辑(仅开启supportTransaction生效)

     */

    FORBIDDEN,

    /**

     * 仅开启supportTransaction生效,

     * 保证多线程访问安全,unlock会在事务完成后再提交。

     * 缺点:会使lock的作用域膨胀。直至上下文事务完成

     */

    THREAD_SAFE;

}

开发者可以根据自己的业务需要使用。本地缓存及事务感知能力同样可作用于自定义的lock(基于包装实现)

7.注解式lock支持

框架实现了基于注解式的lock支持

(1)提供的lock注解

注解

简介

其他

@FailFastLock 快速失败的lock
@LocalLock JVM实现的lock
@Lock 顶层lock注解,支持所有策略及配置参数

@FailFastLock 和@LocalLock都是基于@Lock实现的,扩展注解主要是为了更好的语义以及使用体验,而无需指定多余的配置。比如@FailFastLock 就不用配置等待时间,因为等待时间是0

@Target(value = {ElementType.METHOD})

@Retention(value = RetentionPolicy.RUNTIME)

@Documented

public @interface FailFastLock {

    /**

     * 锁的名称

     *

     * @return name

     */

    String name() default "";

    /**

     * 自定义业务key

     *

     * @return keys

     */

    String[] keys() default {};

}

(2)业务策略及自定义策略

lock从获取句柄,到加锁并执行逻辑代码,最后解锁这个过程可能出现各种异常情况,注解提供了对于以上情况的处理能力

备注:当作用域为全局及注解时,注解的优先级高于全局的设置

策略点

策略名

可选作用域

具体策略

加锁失败的处理策略
lockFailStrategy
全局及注解

1.NO_OPERATION:继续执行业务逻辑,不做任何处理

2.FAIL_FAST:快速失败

3.KEEP_ACQUIRE:一直阻塞,直到获得锁,在太多的尝试后,仍会报错

4.CUSTOMER: 自定义,用于全局默认处理

定制的加锁失败的处理策略 customLockFailStrategy 注解 用户指定,格式为方法的全限定名称
加锁异常的处理策略
lockExceptionStrategy
全局及注解

1.THROW_EXCEPTION:抛出异常

2.CUSTOMER:自定义,用于全局默认处理

释放锁时报错的处理策略
releaseTimeoutStrategy
全局及注解

1.NO_OPERATION:继续执行业务逻辑,不做任何处理

2.FAIL_FAST:快速失败,可自定义异常类及报错信息

3.CUSTOMER: 自定义,用于全局默认处理

自定义释放锁时已超时的处理策略
customReleaseTimeout
Strategy
全局及注解

用户指定,格式为方法的全限定名称

获取锁失败时,报错的异常类型 全局及注解 按照用户指定异常类型报错
获取锁失败时,报错的错误信息 全局及注解 按照用户指定异常信息报错
8.方法级定制以及全局定制能力

框架设计时考虑到用户的自定义需求,提供了方法级定制以及全局定制的能力,以上的策略中,lockFailStrategy,lockExceptionStrategy,releaseTimeoutStrategy 都提供了CUSTOMER的的策略,框架通过java的SPI机制,将对应的用户自实现的策略加载

策略点

策略名

具体配置名

扩展定义接口

加锁失败的处理策略 lockFailStrategy CUSTOMER cn.techwolf.blue.usl.framework.lock.handler.lock.ExceptionOnLockCustomerHandler
加锁异常的处理策略 lockExceptionStrategy CUSTOMER cn.techwolf.blue.usl.framework.lock.handler.lock.FailOnLockCustomerHandler
加锁释放锁异常的处理策略 releaseTimeoutStrategy CUSTOMER cn.techwolf.blue.usl.framework.lock.handler.release.ReleaseTimeoutCustomerHandler

自定义处理策略加载后,如果需要指定为全局,需要在全局配置中指定定位的策略名的配置为CUSTOMER即可开启,方法级同理

注意:无论是全局还是注解的方法级,一旦指定以上策略的配置为CUSTOMER,则系统运行时必须存在对应的实现类,否则报错。不同的是,全局级配置报错将导致项目无法启动文章来源地址https://www.toymoban.com/news/detail-822737.html

到了这里,关于[框架系列]-[通用lock框架] 介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 工具系列:PyCaret介绍_Fugue 集成_Spark、Dask分布式训练

    Fugue 是一个低代码的统一接口,用于不同的计算框架,如 Spark、Dask。PyCaret 使用 Fugue 来支持分布式计算场景。 让我们从最标准的例子开始,代码与本地版本完全相同,没有任何魔法。 compare_model 如果您不想使用分布式系统,也完全相同。 现在让我们将其分布式,作为一个玩

    2024年02月04日
    浏览(51)
  • 开源:Taurus.DTC 微服务分布式事务框架,支持 .Net 和 .Net Core 双系列版本

    在经过1年多的深思,十几年的框架编写技术沉淀下,花了近一个月的时间,终于又为 .Net 及 .Net Core 的微服务系列框架贡献当中的一个重要组件。 https://github.com/cyq1162/Taurus.DTC   由于 CYQ.Data Orm 组件本身支持10多种数据库,因此提供的包,只根据消息队列的需要分拆提供。 默

    2024年02月02日
    浏览(69)
  • 开源:Taurus.Idempotent 分布式幂等性锁框架,支持 .Net 和 .Net Core 双系列版本

    分布式幂等性框架的作用是确保在分布式系统中的操作具有幂等性,即无论操作被重复执行多少次,最终的结果都是一致的。幂等性是指对同一操作的多次执行所产生的效果与仅执行一次的效果相同。 以下是分布式幂等性框架的主要作用: 避免重复操作: 在分布式系统中,

    2024年03月09日
    浏览(39)
  • 通用分布式锁组件

    自定义注解实现通用分布式锁组件。 Redisson官网:https://redisson.org/ Redisson是一个基于Redis的工具包,可以帮助开发人员更轻松地使用Redis,功能非常强大。将JDK中很多常见的队列、锁、对象都基于Redis实现了对应的分布式版本并提供高级的分布式锁,分布式集合,分布式对象,

    2024年04月09日
    浏览(49)
  • Python爬虫之Scrapy框架系列(23)——分布式爬虫scrapy_redis浅实战【XXTop250部分爬取】

    先用单独一个项目来使用scrapy_redis,讲解一些重要点!

    2024年02月16日
    浏览(55)
  • 开源通用高性能的分布式id序列组件

    原文地址:https://ntopic.cn/p/2023062101/ Gitee源代码仓库:https://gitee.com/obullxl/sequence-jdbc GitHub源代码仓库:https://github.com/obullxl/sequence-jdbc 业务数据的存储,少不了数据记录的id序列。 id序列(或称序列)的生成方式有很多种,比如当前时间戳、数据库的序列值(Oracle的序列,MyS

    2024年02月11日
    浏览(80)
  • 分布式服务框架_Zookeeper--管理分布式环境中的数据

    安装和配置详解 本文介绍的 Zookeeper 是以 3.2.2 这个稳定版本为基础,最新的版本可以通过官网   http://hadoop.apache.org/zookeeper/ 来获取, Zookeeper 的安装非常简单,下面将从单机模式和集群模式两个方面介绍 Zookeeper 的安装和配置。 单机模式

    2024年02月12日
    浏览(41)
  • SpringSecurity分布式安全框架

    Spring Security是一个基于Spring框架的安全框架,它提供了全面的安全解决方案,包括用户认证和用户授权等Web应用安全性问题。Spring Security可以轻松扩展以满足自定义需求,它的真正强大之处在于它可以轻松扩展以满足自定义要求。 对于分布式系统来说,Spring Security可以结合

    2024年02月08日
    浏览(48)
  • 分布式事务框架Seata

    分布式事务框架Seata 一、seata是什么 在微服务架构下,由于数据库和应用服务的拆分,导致原本一个事务单元中的多个 DML 操作,变成了跨进程或者跨数据库的多个事务单元的多个 DML 操作, 而传统的数据库事务无法解决这类的问题,所以就引出了分布式事务的概念。 分布式

    2024年02月10日
    浏览(42)
  • Celery分布式异步框架

    \\\"\\\"\\\" 1)可以不依赖任何服务器,通过自身命令,启动服务(内部支持socket) 2)celery服务为为其他项目服务提供异步解决任务需求的 注:会有两个服务同时运行,一个是项目服务,一个是celery服务,项目服务将需要异步处理的任务交给celery服务,celery就会在需要时异步完成项目的

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包