1-Intro
需求. 延迟实现一个任务, 不需要特别复杂的任务调度
- 调度系统,类似于 quartz 的作用
rocketMq, 但是rocketMq有一些所谓的 约束机制- xxl-job : 比较全面的分布式调度系统,但是感觉有点牛刀.
- dkron : 考虑封装这个
sdk, 然后实现 .
这里列举一个 快速实现的 自研偏方,基于 时间轮.
2-时间轮算法
3-实现
伪代码思路:
class TimeWheelTriggerWorker (
val timeWheel: ...
) : Runnable {
fun run() {
// 1. 查询任务
val tasks = queryTasks()
val latestOffset = tasks.last()
// 2.
for (task in tasks) {
// 根据时间直接安排,可以考虑这里配置个多线程去异步的执行
timeWheel.scheduleAt(task, threadPool)
}
// 3. 优化到达一定程度,或者一定时间间隔就触发 flush
storeLatestOffset(latestOffset)
}
}
class TimeWheelTriggerRetryHandler(
val timeWheel: ...
){
fun handle () {
while(true) {
// 假设超过了 15min 还没有调度, 这里就触发
val deadline = now - 15min
val tasks = queryOutTimeOrFailedTasks(deadline)
for (task in tasks) {
// 马上调度执行
timeWheel.scheduleAt(now)
}
}
}
}