时间轮

  1. 时间轮 Timewheel
    1. kafka 时间轮的实现
    2. Golang timewheel 实现
      1. 参考 Kafka 时间轮实现的 golang 版本
      2. 基于 Timer 的版本

时间轮 Timewheel

kafka 时间轮的实现

Kafka Timer 实现源码

Kafka 的层级时间轮实现中,利用了 Java 内置的 DelayQueue 结构,将每一层时间轮中所有 “包含有定时任务的 bucket” 都加入到同一个 DelayQueue 中,然后 等到有 bucket 到期后再驱动时钟往前走,并逐个处理该 bucket 中的定时任务

  1. 往层级时间轮中添加一个定时任务 task1 后,会将该任务所属的 bucket2 的到期时间设置为 task1 的到期时间 expiration(= 当前时间 currentTime + 定时任务到期间隔 duration),并将这个 bucket2 添加(Offer)到 DelayQueue 中。
  2. DelayQueue(内部有一个线程)会等待 “到期时间最早(earliest)的 bucket” 到期,图中等到的是排在队首的 bucket2,于是经由 poll 返回并删除这个 bucket2;随后,时间轮会将当前时间 currentTime 往前移动到 bucket2 的 expiration 所指向的时间(图中是 1ms 所在的位置);最后,bucket2 中包含的 task1 会被删除并执行。

Golang timewheel 实现

参考 Kafka 时间轮实现的 golang 版本

timewheel : https://github.com/RussellLuo/timingwheel.git

  1. PriorityQueue —— 从 NSQ 借用过来的 优先级队列(基于最小堆实现)。
  2. DelayQueue —— Offer(添加 bucket)和 Poll(获取并删除 bucket)的运作方式,跟 Golang Timer 运行时中 addtimerLocked 和 timerproc 的运作方式如出一辙,因此参考了其中的实现方式(参考 原理介绍)。

基于 Timer 的版本

go-timewhee : https://github.com/rfyiamcool/go-timewheel


参考:


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 296245956@qq.com
github