ShedLock核心原理深度剖析:从LockProvider到SchedulerLock的完整工作流程
ShedLock是一个专为分布式环境设计的轻量级锁框架,用于确保你的定时任务在多个节点上最多同时执行一次。如果你正在部署微服务架构,面对定时任务重复执行的问题,ShedLock提供了简单而强大的解决方案。
🔍 什么是ShedLock分布式锁?
ShedLock不是一个完整的分布式调度器,而是一个专注于解决定时任务重复执行问题的锁机制。它的核心思想是:当一个任务正在某个节点上执行时,它会获取一个锁,阻止其他节点(或线程)执行相同的任务。
核心特性包括:
- ✅ 仅对标注了
@SchedulerLock的方法进行锁定 - ✅ 相同名称的任务同一时间只能在一个节点上执行
- ✅ 其他被相同锁保护的任务不会被阻塞,而是直接被跳过
- ✅ 任务完成后立即释放锁(除非指定了
lockAtLeastFor)
🏗️ ShedLock三组件架构
ShedLock由三个核心组件构成,共同构建了完整的分布式锁体系:
1. Core核心模块
位于shedlock-core/,提供基础的锁机制实现,包括LockProvider接口、LockConfiguration配置类等关键组件。
2. Integration集成模块
支持Spring AOP、Micronaut AOP或手动代码集成,将锁机制与应用框架无缝对接。
3. LockProvider锁提供器
通过各种外部存储提供锁服务,包括SQL数据库、MongoDB、Redis、Hazelcast等。
🔄 完整工作流程解析
任务触发阶段
当Spring的定时任务调度器触发一个任务时,ShedLock通过两种代理模式介入:
方法级代理模式
工作流程:
- Spring Scheduling生成
Runnable任务实例 - TaskScheduler接收并准备执行任务
- AOP代理拦截方法调用,包装目标
ScheduledMethod - 代理调用
executeIfNotLocked()方法检查分布式锁 - 获取锁成功后执行实际业务逻辑
调度器级代理模式
工作流程:
- Spring Scheduling生成
Runnable任务 - TaskScheduler AOP代理拦截任务提交
- 将普通
Runnable转换为LockableRunnable - 真实
TaskScheduler执行包装后的任务 - 在
run()方法中检查分布式锁
锁获取与执行阶段
无论采用哪种代理模式,核心逻辑都在executeIfNotLocked()方法中实现:
// 伪代码示意
if (lockProvider.lock(lockConfig)) {
try {
// 执行实际业务逻辑
scheduledMethod.execute();
} finally {
lockProvider.unlock(lockConfig);
}
}
📊 锁配置策略详解
lockAtMostFor安全网机制
必须设置lockAtMostFor,确保即使节点崩溃,锁也会在一定时间后自动释放。建议设置为远大于正常执行时间的值。
lockAtLeastFor时钟同步保护
防止在极短任务和节点时钟差异的情况下,多个节点同时执行任务。
实战配置示例
@Scheduled(cron = "0 */15 * * * *")
@SchedulerLock(name = "scheduledTaskName",
lockAtMostFor = "14m",
lockAtLeastFor = "14m")
public void scheduledTask() {
// 业务逻辑
}
🔧 LockProvider实现生态
ShedLock支持丰富的锁提供器实现:
数据库类
- JdbcTemplate:最常用的数据库锁提供器
- R2DBC:响应式数据库支持
- jOOQ:类型安全的SQL构建
- Exposed:Kotlin SQL框架
NoSQL类
- MongoDB:文档数据库支持
- Redis:内存数据库支持
- Cassandra:宽列数据库支持
云服务类
- DynamoDB:AWS云数据库
- Firestore:Google云数据库
- S3:对象存储支持
🚀 最佳实践指南
1. 正确配置锁超时时间
@Configuration
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "10m")
class MySpringConfiguration {
// 配置
}
2. 使用数据库时间
强烈推荐使用usingDbTime()选项,基于数据库服务器时钟,避免应用服务器时钟不同步问题。
3. 锁断言验证
@Scheduled(...)
@SchedulerLock(name = "taskName")
public void scheduledTask() {
LockAssert.assertLocked(); // 防止配置错误
// 业务逻辑
}
⚠️ 重要注意事项
不要手动删除锁记录
ShedLock在内存中缓存现有的锁记录,手动删除会导致锁记录无法自动重建。
不是分布式调度器
ShedLock只提供锁功能,不负责任务调度。如果你需要完整的分布式调度器,请考虑其他项目。
🎯 总结
ShedLock通过简洁而强大的设计,解决了分布式环境下定时任务重复执行的核心痛点。从LockProvider的多样化实现到SchedulerLock的智能代理,整个工作流程体现了"简单即是美"的设计哲学。
无论你选择哪种LockProvider实现,核心的工作流程都保持一致:拦截 → 检查锁 → 执行 → 释放锁。这种一致性使得ShedLock在不同技术栈中都能提供可靠的服务。
分布式定时任务管理从未如此简单 🎉
GLM-5智谱 AI 正式发布 GLM-5,旨在应对复杂系统工程和长时域智能体任务。Jinja00
GLM-5-w4a8GLM-5-w4a8基于混合专家架构,专为复杂系统工程与长周期智能体任务设计。支持单/多节点部署,适配Atlas 800T A3,采用w4a8量化技术,结合vLLM推理优化,高效平衡性能与精度,助力智能应用开发Jinja00
请把这个活动推给顶尖程序员😎本次活动专为懂行的顶尖程序员量身打造,聚焦AtomGit首发开源模型的实际应用与深度测评,拒绝大众化浅层体验,邀请具备扎实技术功底、开源经验或模型测评能力的顶尖开发者,深度参与模型体验、性能测评,通过发布技术帖子、提交测评报告、上传实践项目成果等形式,挖掘模型核心价值,共建AtomGit开源模型生态,彰显顶尖程序员的技术洞察力与实践能力。00
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00
MiniMax-M2.5MiniMax-M2.5开源模型,经数十万复杂环境强化训练,在代码生成、工具调用、办公自动化等经济价值任务中表现卓越。SWE-Bench Verified得分80.2%,Multi-SWE-Bench达51.3%,BrowseComp获76.3%。推理速度比M2.1快37%,与Claude Opus 4.6相当,每小时仅需0.3-1美元,成本仅为同类模型1/10-1/20,为智能应用开发提供高效经济选择。【此简介由AI生成】Python00
Qwen3.5Qwen3.5 昇腾 vLLM 部署教程。Qwen3.5 是 Qwen 系列最新的旗舰多模态模型,采用 MoE(混合专家)架构,在保持强大模型能力的同时显著降低了推理成本。00- RRing-2.5-1TRing-2.5-1T:全球首个基于混合线性注意力架构的开源万亿参数思考模型。Python00

