SpringBoot集成ShedLock实现分布式锁

Posted nnsword

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot集成ShedLock实现分布式锁相关的知识,希望对你有一定的参考价值。

介绍

参考自技术雷达

有一种很常见的需求,是在分布式处理器集群上执行一次定时任务,且只执行一次。例如处理一批数据,发送一条通知,或者执行某个常规的清理操作,都属于这类情况。但是谁都知道这个问题很难,一组处理器如何通过有延迟而且不稳定的网络来实现稳定的协作?这就需要在集群中存在某种锁定机制,来协调这些操作。幸好有很多分布式存储可以实现这种锁定,ZooKeeper 和 Consul 等系统,以及 DynamoDB 或 Couchbase 等数据库都有必要的底层机制来管理集群内部的一致性。ShedLock 是一个小型类库,如果你正在尝试用 Java 来实现自己的定时任务,它可以使你的代码更方便地和上述工具集成。ShedLock 有获得和释放锁的 API,还有各种连接器,可以适配不同工具的锁。如果您正在编写自己的分布式任务,但是不想使用 Kubernetes 这种复杂的重量级平台,ShedLock 值得一试。

使用方法

加入依赖

     <dependency>
            <groupId>net.javacrumbs.shedlock</groupId>
            <artifactId>shedlock-spring</artifactId>
            <version>2.3.0</version>
        </dependency>

        <dependency>
            <groupId>net.javacrumbs.shedlock</groupId>
            <artifactId>shedlock-provider-jdbc-template</artifactId>
            <version>2.3.0</version>
        </dependency>

代码改造

    @Scheduled(cron = "0 0/15 * * * ?")
    @SchedulerLock(name = "lockName", 
            lockAtMostFor = 10 * 60 * 1000, lockAtLeastFor = 5 * 60 * 1000)
    public void execute() 
        //todo
    

在SpringBoot的入口类上添加启用锁注解

@SpringBootApplication
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")
public class Application 


至此,实现多节点分布式锁,同时同一个任务只在一个节点执行。

结束语

那么shedLock是如何实现同一任务仅在一个节点上执行呢?
shedLock 当多个节点都有定时,某个节点启动后,会获得持久数据中shedLock表中的锁,其他的定时再来时,无法获取锁对象,认为其他的节点已经在执行了,所以就不在去执行。这个表是shedLock自带的表,无需程序员自己维护。
注:这样会存在一个问题,可能所有任务都会在一个节点上被执行,少了负载均衡的算法调度。仅本人猜测,未验证

以上是关于SpringBoot集成ShedLock实现分布式锁的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot集成ShedLock实现分布式锁

Spring Boot集成ShedLock分布式定时任务实例

【SpringBoot实战】分布式定时任务锁Shedlock

springBoot框架shedlock+websocket功能冲突的解决方案

Springboot(2.2.2)+Mybatis-Plus(3.0-RC3)+shedLock

SpringBoot集成Zipkin实现分布式全链路监控