0 本文主要涉及

说明时间轮算法原理和优势,以及Kafka中改良版的时间轮

1时间轮算法说明

时间轮算法来源于 George Varghese 和 Tony Lauck 1996 年的论文 <Hashed and Hierarchical Timing Wheels: data structures to efficiently implement a timer facility>
时间轮算法是一种高效的定时任务管理算法(不涉及执行任务),任务增删查时间复杂度O(1),对比Java标准库Timer使用小顶堆实现,任务增删复杂度为O(logN)
原理:

时间轮就是如图所示的一种抽象数据结构,一个循环列表(circular buffer),每个列表中包含一个称之为槽(slot)
工作时图中的箭头按某一方向按固定频率轮动,每一次转动称为一个 tick,我们可以定义转一圈的的总 tick 数为ticksPerWheel,一个 tick 的持续时间为tickDuration*timeUnit(时间单位),以此来表示具体的时刻,而需要在某一时刻执行的任务通过连表方式存储在相应slot上(通过mod取余hash找到对应的slot),当指针转动到相应的slot时就去执行slot上的任务。
当时间跨度很大时,可以用多层时间轮来表示,或者也可以构造一个很大的时间轮

2Kafka中的时间轮

KafkaScheduler是Kafka的后台任务调度资源池,为LogManager、ReplicaManager和OffsetManager 等提供定时调度服务。
KafkaScheduler通过DelayedOperationPurgatory实现管理延迟操作,更底层则依赖于时间轮实现(像Kafka这种分布式系统的请求量巨大,性能要求也很高,JDK提供java.util.Timer和DelayedQueue底层实现使用的是堆这种数据结构,存取操作的复杂度都是O(nlog(n)),无法支持大量的定时任务,为了将定时任务的存取操作以及取消操作的时间复杂度降为O(1),一般会使用其他方式实现定时任务组件)
TimingWheel是一个存储定时任务的环形队列,底层使用数组实现,数组中的每个元素可以存放一个TimerTaskList对象。TimerTaskList是环形双向链表,在其中的链表项TimerTaskEntry中封装了真正的定时任务TimerTask。
TimerTaskList使用expiration 字段记录了整个TimerTaskList的超时时间。TimerTaskEntry中的expirationMs字段记录了超时时间戳,timerTask 字段指向了对应的TimerTask任务。
TimeTask中的delayMs记录了任务的延迟时间,timerTaskEntry字段记录了对应的TimerTaskEntry对象。
这三个对象是TimingWheel实现的基础。
TimingWheel提供了层级时间轮的概念,第一层时间轮的时间跨度比较小,而第二层时间轮的时间跨度比较大,以此类推。
TimeWheel中提供了add()、advanceClock()、addOverflowWheel()三个方法
add()方法实现了向时间轮中添加定时任务的功能
addOverflowWheel()方法会创建上层时间轮,默认情况下上层时间轮的tickMs是当前整个时间轮的时间跨度interval
advanceClock()方法会尝试推进当前时间轮的表针currentTime,同时也会尝试推进上层的时间轮的表针。随着当前时间轮的表针不断被推进,上层时间轮的表针也早晚会被推进成功
SystemTimer
SystemTimer是Kafka中的定时器实现,它在TimeWheel的基础上添加了执行到期任务、阻塞等待最近到期任务的功能。
SystemTimer.add()方法在添加过程中如果发现任务已经到期,则将任务提交到taskExecutor中执行;如果任务未到期,则调用TimeWheel.add()方法提交到时间轮中等待到期后执行
SystemTimer.advanceClock()方法完成了时间轮表针的推进,同时对到期的TimerTaskList中的任务进行处理。如果TimerTaskList到期,但是其中的某些任务未到期,会将未到期任务进行降级,添加到低层次的时间轮中继续等待;如果任务到期了,则提交到taskExecutor线程池中执行
DelayedOperation
DelayedOperation抽象类表示延迟操作,它对TimeTask进行了扩展,除了有定时执行的功能,还提供了检测其他执行条件的功能。我们可以认为DelayedOperation是一个延迟的、异步的操作。具体有四个实现类DelayedProduce,DelayedFetch,DelayedJoin ,DelayedHeartbeat,DelayedOperationPurgatory实际就是在管理这些DelayedOperation以及处理到期DelayedOperation。
总体结构如图:

实现上,Kafka的时间轮与普通的时间轮有所不同,Kafka的时间轮结构仅用于查询到期任务,时间的推进并不同于普通的时间轮实现按最小单位逐步推进完成,而是依赖于Java标准库中的DelayedQueue.poll()方法实现(通过小顶堆实现,获取并删除最近任务,时间复杂度为O(logN)),这样减少了无效的时间轮空转,不过额外增加了DelayedQueue中的堆结构需要维护(其中存放了TimerTaskList,由于时间轮中槽的个数是固定的,对应的TimerTaskList也只会往堆中添加一次,而添加具体任务操作是在TimerTaskList内,增加的额外操作可以接受)

参考博文:
Timing Wheel 定时轮算法 https://blog.csdn.net/mindfloating/article/details/8033340
惊艳的时间轮定时器 https://www.cnblogs.com/zhongwencool/p/timing_wheel.html
netty 源码解读之时间轮算法实现 - HashedWheelTimer https://zacard.net/2016/12/02/netty-hashedwheeltimer/
TimingWheel 本质与 DelayedOperationPurgatory 核心结构https://blog.csdn.net/chunlongyu/article/details/52971748
Kafka 解惑之时间轮(TimingWheel)https://blog.csdn.net/u013256816/article/details/80697456

Kafka时间轮学习总结相关推荐

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

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

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

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

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

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

  4. 【kafka】kafka 时间轮 TimingWheel

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

  5. 6张图阐述Kafka心跳机制(时间轮算法的具体运用)

    Broker端与客户端的心跳在Kafka中非常的重要,因为一旦在一个心跳过期周期内(默认10s),Broker端的消费组组协调器(GroupCoordinator)会把消费者从消费组中移除,从而触发重 ...

  6. 从 Kafka 看时间轮算法设计

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:https://juejin.cn/post/7047405443961847816 前言 Kafka 中有很多延时操作,比如 ...

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

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

  8. java方法里面能改定时器的时间吗_Kafka 时间轮的原理和实现

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

  9. 网络编程 高性能定时器数据结构分析 | 时间轮 红黑树定时器性能分析 | 为什么要做用户态定时器

    为什么要用户态的定时器? 首先是为什么要做定时器,定时器的主要说的是我们的应用(业务?功能?总之有这个需求)要做一个定时的任务.其实如果不想为什么,好像是理所当然的.我写这个的时候,知乎有一个问题(L ...

最新文章

  1. Unity中对象池的使用
  2. Windows下更改mysql data目录
  3. 吃货都是怎么给自己找理由的? | 今日最佳
  4. 我们应该学习什么 java、C#还是C++(VC)
  5. sparkstreaming 读取mysql_第十篇|SparkStreaming手动维护Kafka Offset的几种方式
  6. QScrollArea滚动条
  7. java字符编码详解_Java中字符编码格式详解
  8. 目标跟踪之MOSSE算法(C++版本配置及原理简介)
  9. 高德地图vs百度地图
  10. Mp3帧分析(数据帧)
  11. The remote device or resource won't accept the connect
  12. C++ SLT中的容器学习与函数谓词
  13. XShell远程登录华为云服务器
  14. 一个简单的字幕滚动程序~~
  15. jQuery快速掌握(看这一篇就够了)
  16. 从隔壁老王开始的信号处理入门
  17. 全国高校计算机能力挑战赛
  18. EtherCAT 寻址模式详解
  19. 怎么用 UDP 实现 TCP?
  20. python爬虫 知乎_python爬虫——知乎(关于python的精华回答)

热门文章

  1. python视频在线教程_600集Python从小白到大神
  2. dede采集插件自动采集文章图片自定义接口
  3. 此应用程序当前处于脱机状态
  4. AD账号属性的 PwdLastSet 和 PasswordLastSet 有什么区别?
  5. MySQL学习笔记3---Explain字段分析
  6. 计算机课教学进度,小学信息技术教学进度表.doc
  7. 计算机网络——应用层之电子邮件(E-mail)
  8. 高等数学——导数的定义和常见导数
  9. ❤️【Android精进之路-01】定计划,重行动来学Android吧❤️
  10. Redis实战demo