1-Intro

需求. 延迟实现一个任务, 不需要特别复杂的任务调度

  1. 调度系统,类似于 quartz 的作用
  2. rocketMq, 但是 rocketMq 有一些所谓的 约束机制
  3. xxl-job : 比较全面的分布式调度系统,但是感觉有点牛刀.
  4. 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)
			}
			
		}
	}
}