Dubbo时间轮定时任务!
Dubbo时间轮定时任务!
月伴飞鱼JDK 提供的简单的定时任务管理:
- 其底层实现使用的是堆这种数据结构,存取操作的复杂度都是
O(nlog(n))
,无法支持大量的定时任务。时间轮是一种高效的、批量管理定时任务的调度模型。
- 在定时任务量比较大、性能要求比较高的场景中
- 为了将定时任务的存取操作以及取消操作的时间复杂度降为
O(1)
,一般会使用时间轮的方式。时间轮一般会实现成一个环形结构,类似一个时钟,分为很多槽。
- 一个槽代表一个时间间隔,每个槽使用双向链表存储定时任务。
- 指针周期性地跳动,跳动到一个槽位,就执行该槽位的定时任务。
Dubbo 的时间轮实现位于
dubbo-common
模块的org.apache.dubbo.common.timer
包中。
Dubbo
中如何使用定时任务:
在 Dubbo 中,时间轮并不直接用于周期性操作,而是只向时间轮提交执行单次的定时任务
- 在上一次任务执行完成的时候,调用
newTimeout()
方法再次提交当前任务,这样就会在下个周期执行该任务。即使在任务执行过程中出现了 GC、I/O 阻塞等情况,导致任务延迟或卡住
- 也不会有同样的任务源源不断地提交进来,导致任务堆积。
Dubbo中对时间轮的应用:
失败重试:
- 例如,
Provider
向注册中心进行注册失败时的重试操作
- 或是
Consumer
向注册中心订阅时的失败重试等。周期性定时任务:
- 例如,定期发送心跳请求,请求超时的处理
- 或是网络连接断开后的重连机制。