从0实现Golang高性能定时器

现在在做的业务有大量循环定期任务,目前用的是小根堆+定期check,前几天面试,面试官建议可以用时间轮,但是golang还没有我特别喜欢的实现,所以决定自己写(zao)一(lun)个(zi)。

希望的feature:

  1. 自定义时间粒度。
  2. 支持一次性定时,周期性定时。
  3. 高性能
  4. 支持传函数参数。(个人需求)
  5. 支持sleep。

预备资料

| 定时器库 | 实现原理 | 缺点 | 优点
| —- | —- | —-
|<Go1.10 timer | 全局唯一的timerproc协程和time bucket(四叉堆)。|全局共用的互斥锁开销过大。 | 四叉堆对缓存友好。
|Go1.10-1.13 timer| GOMAXPROCS(默认64) 个timerproc协程和time bucket,进行分桶。| 处理器和协程之间频繁的上下文切换。| 分桶,降低锁粒度。
|>Go1.14 timer| 取消timerproc协程和桶,timer直接和处理器(runtime.p)绑定,都交由处理器的网络轮询器和调度器触发。 | |充分利用本地性、减少线上上下文的切换开销,也是目前性能最好的实现方式。
|Netty|
|kafka|

总体结构

逻辑

benchmark