【摘要】 Kafka时间轮是Kafka实现高效的延时任务的基础,它模拟了现实生活中的钟表对时间的表示方式,同时,时间轮的方式并不仅限于Kafka,它是一种通用的时间表示方式,本文主要介绍Kafka中的时间轮原理。

Kafka中存在一些定时任务(DelayedOperation),如DelayedFetch、DelayedProduce、DelayedHeartbeat等,在Kafka中,定时任务的添加、轮转、执行、消亡等是通过时间轮来实现的。(时间轮并不是Kafka独有的设计,而是一种通用的实现方式,Netty中也有用到时间轮的方式)

1. 时间轮是什么

参考网上的两张图(摘自 https://blog.csdn.net/u013256816/article/details/80697456)

这两张图就比较清楚的说明了Kafka时间轮的结构了:类似现实中的钟表,由多个环形数组组成,每个环形数组包含20个时间单位,表示一个时间维度(一轮),如:第一层时间轮,数组中的每个元素代表1ms,一圈就是20ms,当延迟时间大于20ms时,就“进位”到第二层时间轮,第二层中,每“一格”表示20ms,依此类推…

对于一个延迟任务,大体包含三个过程:进入时间轮、降级和到期执行。

  • 进入时间轮

1. 根据延迟时间计算对应的时间轮“层次”(如钟表中的“小时级”还是“分钟级”还是“秒级”,实际上是一个不断“升级”的过程,直到找到合适的“层次”)

2. 计算在该轮中的位置,并插入该位置(每个bucket是一个双向链表,可能包含多个延迟任务,这也是时间轮提高效率的一大原因,后面会提到)

3. 若该bucket是首次插入,需要将该bucket加入DelayQueue中(DelayQueue的引入是为了解决“空推进”,后面会提到)

  • 降级

1. 当时间“推进”到某个bucket时,说明该bucket中的任务在当前时间轮中的时间已经走完,需要进行“降级”,即进入更小粒度的时间轮中,reinsert的过程和进入时间轮是类似的

  • 到期执行

1. 在reinsert的过程中,若发现已经到期,则执行这些任务

整体过程大致如下:

2. 时间的“推进”

一种直观的想法是,像现实中的钟表一样,“一格一格”地走,这样就需要有一个线程一直不停的执行,而大多数情况下,时间轮中的bucket大部分是空的,指针的“推进”就没有实质作用,因此,为了减少这种“空推进”,Kafka引入了DelayQueue,以bucket为单位入队,每当有bucket到期,即queue.poll能拿到结果时,才进行时间的“推进”,减少了 ExpiredOperationReaper 线程空转的开销。

3. 为什么要用时间轮

用到延迟任务时,比较直接的想法是DelayQueue、ScheduledThreadPoolExecutor 这些,而时间轮相比之下,最大的优势是在时间复杂度上:

时间复杂度对比:

因此,理论上,当任务较多时,TimingWheel的时间性能优势会更明显

总结一下Kafka时间轮性能高的几个主要原因:

(1)时间轮的结构+双向列表bucket,使得插入操作可以达到O(1)的时间复杂度

(2)Bucket的设计让多个任务“合并”,使得同一个bucket的多次插入只需要在delayQueue中入队一次,同时减少了delayQueue中元素数量,堆的深度也减小,delayqueue的插入和弹出操作开销也更小

点击关注,第一时间了解华为云新鲜技术~

解惑“高深”的Kafka时间轮原理,原来也就这么回事!相关推荐

  1. Kafka 时间轮的原理和实现

    女主宣言 Kafka 作为一个支持实时处理大量请求的分布式流处理平台,需要一个设计良好的定时器来处理异步任务.本文作者将基于 Kafka 1.1.0 版本的源码来介绍 Kafka 中定时器的基础数据结 ...

  2. kafka时间轮linux时间轮,Kafka解惑之时间轮 (TimingWheel)

    Kafka中存在大量的延迟操作,比如延迟生产.延迟拉取以及延迟删除等.Kafka并没有使用JDK自带的Timer或者DelayQueue来实现延迟的功能,而是基于时间轮自定义了一个用于实现延迟功能的定 ...

  3. Kafka时间轮学习总结

    0 本文主要涉及 说明时间轮算法原理和优势,以及Kafka中改良版的时间轮 1时间轮算法说明 时间轮算法来源于 George Varghese 和 Tony Lauck 1996 年的论文 <H ...

  4. HashedWheelTimer时间轮原理分析

    HashedWheelTimer时间轮是一个高性能,低消耗的数据结构,它适合用非准实时,延迟的短平快任务,例如心跳检测. 概要 时间轮是一种非常惊艳的数据结构.其在Linux内核中使用广泛,是Linu ...

  5. Netty技术细节源码分析-HashedWheelTimer时间轮原理分析

    本文是该篇的修正版 本文的github地址:点此 该文所涉及的netty源码版本为4.1.6. Netty时间轮HashedWheelTimer是什么 Netty的时间轮HashedWheelTime ...

  6. 【kafka】kafka 时间轮 TimingWheel

    1.概述 M.参考 Kafka技术内幕样章 层级时间轮

  7. XXL-JOB核心源码解读及时间轮原理剖析

    你好,今天我想和你分享一下XXL-JOB的核心实现.如果你是XXL-JOB的用户,那么你肯定思考过它的实现原理:如果你还未接触过这个产品,那么可以通过本文了解一下. XXL-JOB的架构图(2.0版本 ...

  8. [从源码学设计]蚂蚁金服SOFARegistry之时间轮的使用

    [从源码学设计]蚂蚁金服SOFARegistry之时间轮的使用 文章目录 [从源码学设计]蚂蚁金服SOFARegistry之时间轮的使用 0x00 摘要 0x01 业务领域 1.1 应用场景 0x02 ...

  9. Kafka原理--时间轮(延时操作)

    原文网址:Kafka原理--时间轮(延时操作)_IT利刃出鞘的博客-CSDN博客 简介 说明         本文介绍Kafka的时间轮的原理. Kafka没有延迟队列功能供用户使用,本文介绍的延时操 ...

最新文章

  1. 基于用户投票的排名算法(一):Delicious和Hacker
  2. 张迈机器人_财会类专业建设改革千人高峰论坛圆满召开!
  3. GNU make manual 翻译(七十三)
  4. Windows Server 2008终端服务详解系列5:用ISA 发布SH-TSG
  5. 精简linux操作系统,Tiny Core Linux—仅10多MB的精简Linux 操作系统发行版
  6. css3和jQuery实现一个简单的标签页效果
  7. MySQL实验7存储过程_mysql的总结7--存储过程-阿里云开发者社区
  8. 修改vCenter client无法连接
  9. 防止被偷窥和修改 Office文档保护秘笈
  10. java计算机毕业设计ssm+vue工商学院办公用品管理信息系统
  11. java动态二维数组定义_Java动态定义二维数组问题
  12. (C语言)教师信息管理系统
  13. java方法的重写和重载_Java方法重载和重写原理区别解析
  14. 【已失效】创维DT741-csf光猫管理员/root超级密码获取方法
  15. 第一季 停课模拟考试整理(完结)
  16. Python .format()的详细使用(英文版)
  17. 网络爬虫学习(二) selenium
  18. burn suite启动_Microsoft计划(最终)启动Web Office Suite
  19. Java中存取Rtf文件
  20. 怎么把jpg文件转换成pdf文件

热门文章

  1. Bootstrap3 地址元素样式
  2. CSS 字体风格 font-style属性
  3. catia圆柱转化为圆台_中考难点,最值问题之构造与转化
  4. 爬虫是根据什么判断html,什么是爬虫技术
  5. 洛谷 - P3935 - Calculating - 整除分块
  6. pycharm 激活方法分享(有效期至2099)
  7. python面试题_01
  8. Docker(十七)-修改Docker容器启动配置参数
  9. 通过Ftp put命令上传导致文件损坏的解决办法
  10. 带你走进SAP项目实施过程——前言(0)