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实现分布式锁的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot集成ShedLock分布式定时任务实例
【SpringBoot实战】分布式定时任务锁Shedlock
springBoot框架shedlock+websocket功能冲突的解决方案