Dubbo时间轮定时任务!

JDK 提供的简单的定时任务管理:

  • 其底层实现使用的是这种数据结构,存取操作的复杂度都是O(nlog(n)),无法支持大量的定时任务。

时间轮是一种高效的、批量管理定时任务的调度模型。

  • 在定时任务量比较大、性能要求比较高的场景中
    • 为了将定时任务的存取操作以及取消操作的时间复杂度降为 O(1),一般会使用时间轮的方式。

时间轮一般会实现成一个环形结构,类似一个时钟,分为很多槽。

  • 一个槽代表一个时间间隔,每个槽使用双向链表存储定时任务。
  • 指针周期性地跳动,跳动到一个槽位,就执行该槽位的定时任务。

Dubbo 的时间轮实现位于 dubbo-common 模块的 org.apache.dubbo.common.timer 包中。

Dubbo中如何使用定时任务:

在 Dubbo 中,时间轮并不直接用于周期性操作,而是只向时间轮提交执行单次的定时任务

  • 在上一次任务执行完成的时候,调用 newTimeout() 方法再次提交当前任务,这样就会在下个周期执行该任务。

即使在任务执行过程中出现了 GC、I/O 阻塞等情况,导致任务延迟或卡住

  • 也不会有同样的任务源源不断地提交进来,导致任务堆积。

Dubbo中对时间轮的应用:

失败重试:

  • 例如,Provider 向注册中心进行注册失败时的重试操作
    • 或是 Consumer 向注册中心订阅时的失败重试等。

周期性定时任务:

  • 例如,定期发送心跳请求,请求超时的处理
    • 或是网络连接断开后的重连机制。