go-zero 如何应对海量定时/延迟任务?( 二 )

上面的过程可以简化成下面:
steps = d / intervalpos = step % numSlots - 1circle = (step - 1) / numSlots总结

  1. timingWheel 靠定时器推动 , 时间前进的同时会取出当前时间格中 list「双向链表」的task , 传递到 execute 中执行 。 因为是是靠 internal 固定时间刻度推进 , 可能就会出现:一个 60s 的task , internal = 1s , 这样就会空跑59次loop 。
  2. 而在扩展时间上 , 采取 circle 分层 , 这样就可以不断复用原有的 numSlots, 因为定时器在不断 loop , 而执行可以把上层的 slot 下降到下层 , 在不断 loop 中就可以执行到上层的task 。 这样的设计可以在不创造额外的数据结构 , 突破长时间的限制 。
同时在 go-zero 中还有很多实用的组件工具 , 用好工具对于提升服务性能和开发效率都有很大的帮助 , 希望本篇文章能给大家带来一些收获 。
项目地址
【go-zero 如何应对海量定时/延迟任务?】好未来技术