专栏首页Spark学习技巧解惑“高深”的Kafka时间轮原理,原来也就这么回事!

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

【摘要】 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的插入和弹出操作开销也更小。

本文分享自微信公众号 - Spark学习技巧(bigdatatip),作者:华为云开发者社区

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-11-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 利用 Kafka 设置可靠的高性能分布式消息传递基础架构

    世界已经迈进“移动”时代,现在应用程序必须能够实时提供数据,这不仅包括数据库表中存储的重要最终结果,还包括用户使用应用程序时执行的所有操作。任何可用信息,例如,...

    Spark学习技巧
  • Flink系列之时间

    一,fink支持的时间 Flink的流式应用支持不同的时间观。 1,处理时间 处理时间是指执行相应操作的机器的系统时间。 当流程序采用处理时间运行时,所有基于时...

    Spark学习技巧
  • 大数据可能“说谎” 非结构化数据将呈现更丰富的世界

    在过去几年,大数据产业更多关注的是如何处理海量、多源和异构的数据,并从中获得价值,而其中绝大多数都是结构化数据。不可否认,这些数据的体量足够巨大,然而我们今天必...

    Spark学习技巧
  • Tensorflow

    ##################################################################

    Dean0731
  • 目标检测第4步-模型测试

    本文在学习《Tensorflow object detection API 搭建属于自己的物体识别模型(2)——训练并使用自己的模型》的基础上优化并总结,此博客...

    潇洒坤
  • SaaS企业灵魂拷问:大客户是什么?怎么做?

    ? 2B SaaS要不要做大客户?我想没人会说不做。正所谓有条件要上、没有条件创造条件也要上。 要切入大客户,首先必须搞清楚:对于2B SaaS来说,究竟什...

    腾讯SaaS加速器
  • 当我家咖啡机管我要赎金的时候,我就知道IoT还是不怎么靠谱

    一旦被冠上“智能”这个名字,似乎所有的电器、产品都比之前传统的产品更有价值更聪明。

    大数据文摘
  • 关于客户满意度的十个建议

    无论是哪个行业或在哪个客户接触点,响应的及时性变得越来越重要,并成为总体满意度的核心驱动力。 原因是:业务发展得越来越快; 等待令人沮丧; 注意力下降; 迅速响...

    臭豆腐
  • 腾讯企点张晔:360度数字化能力平台助力企业获得增长新动能

    小佛爷说 在产能过剩、全球化困境和疫情等叠加影响下,各行各业都在新形势下苦苦求索增长新动能。随着新基建快速展开,数字化转型俨然成为企业持续发展的重要驱动力。在...

    腾讯企点
  • 索尼在巴黎游戏周发布的11款PSVR新作,都在这里了

    VRPinea

扫码关注云+社区

领取腾讯云代金券