Kafka中的时间轮算法

1. Kafka与时间轮:

Kafka的定时器底层使用时间轮算法。Kafka时间轮是层次时间轮,并且支持时间轮复用。

优点:

  • 高效的插入操作:
    • 时间轮底层数据结构(桶),使用双向链表的设计使得插入操作的时间复杂度达到O(1)。
    • 把相同到期时间的任务放到桶中,在DQ中只插入一次。
  • 层级时间轮,时间轮有升降级机制。
  • 复用过期时间格。

优秀文章:

Kafka如何通过层级时间轮实现延时消息队列?_kafka基于时间轮如何实现延迟队列-CSDN博客 -> 非常不错的文章

时间轮(TimingWheel)-CSDN博客 -> 使用图例方式演示

2. Kafka时间轮(TimingWheel)算法:

  • 时间轮的算法思想可以通过我们日常生活中的钟表来理解。
  • 一个存储定时任务的环形队列。底层采用数组实现,数组中的每个元素存放一个定时任务列表(TimerTaskList)。
  • 定时任务列表是一个环形的双向链表,链表中的每一项表示一个定时任务项(TimerTaskEntry),其中封装了真正的定时任务(TimerTask)。

3. Kafka如何支持大跨度的定时任务呢?

两种解决方案:使用增加轮次/圈数的概念(Netty 的 HashedWheelTimer )、使用多层时间轮的概念 (Kafka 的 TimingWheel)。

多层时间轮就更像我们钟表的概念。秒针走的一圈、分针走的一圈和时针走的一圈就形成了一个多层时间轮的关系。

4. Kakfa时间轮中DelayQueue的作用:

1.使用DelayQueue推进时间轮往前走,并且避免时间轮的空推进。

2.使用DelayQueue获取到期的任务。

拓展:时间轮使用DQ,如何避免空推荐?

Kafka则是通过DelayQueue来推进,是一种空间换时间的思想:

  • DelayQueue 中保存着所有的 TimerTaskList 对象,根据时间来排序,这样延时越小的任务排在越前面。
  • 外部通过一个线程(叫做ExpiredOperationReaper)从 DelayQueue 中获取超时的任务列表 TimerTaskList,然后根据 TimerTaskList 的 过期时间来精确推进时间轮的时间,这样就不会存在空推进的问题啦。

拓展:时间轮用到了DQ,为什么不直接用DQ?

1.性能高:

1.1 DQ插入和删除操作都是O(log n),时间轮算法的插入和删除操作都是 O(1) -> 底层是任务的添加和删除是基于链表实现的。

1.2 DQ只存放了TimerTaskList,并不是所有的TimerTask,所以数量并不多。

相关推荐
yugi9878381 天前
基于Matlab的晴空指数计算实现
开发语言·算法·matlab
ADI_OP1 天前
ADAU1452的开发教程3:常规音频算法的开发(2)
算法·dsp开发·adi dsp中文资料·adi dsp·adi音频dsp·adi dsp开发教程
666HZ6661 天前
数据结构1.0 数据结构在学什么
数据结构·算法
君义_noip1 天前
信息学奥赛一本通 1951:【10NOIP普及组】导弹拦截 | 洛谷 P1158 [NOIP 2010 普及组] 导弹拦截
c++·算法·csp-j·信息学奥赛
环黄金线HHJX.1 天前
《QuantumTuan ⇆ QT:Qt》
人工智能·qt·算法·编辑器·量子计算
jz_ddk1 天前
[实战] 射频相位噪声单位转换:从dBc/Hz到rad
算法·rf·射频·相位噪声·相噪
zl_vslam1 天前
SLAM中的非线性优-3D图优化之地平面约束(十五)
人工智能·算法·计算机视觉·3d
空空潍1 天前
hot100-滑动窗口最大值(day11)
数据结构·c++·算法·leetcode
朔北之忘 Clancy1 天前
2025 年 6 月青少年软编等考 C 语言一级真题解析
c语言·开发语言·c++·学习·算法·青少年编程·题解
guygg881 天前
结合VD算法与IMM算法的卡尔曼滤波机动目标跟踪方法
人工智能·算法·目标跟踪