20 | DelayedOperation:Broker是怎么延时处理请求的?
- 深入了解
- 翻译
- 解释
- 总结
Kafka中的DelayedOperation机制通过分层时间轮实现请求的延时处理。分层时间轮由多个层次组成,每层表示的总时长是该层Bucket数乘以每个Bucket的时间范围。SystemTimer类封装了分层时间轮对象,为Purgatory提供延迟请求管理功能。DelayedOperation类是所有Kafka延迟请求类的抽象父类,它的构造函数中只需要传入一个超时时间即可。DelayedOperationPurgatory类是实现Purgatory的地方,它是一个泛型类,通常情况下,每一类延迟请求都对应于一个DelayedOperationPurgatory实例。DelayedOperationPurgatory类的字段包括purgatoryName、timeoutTimer、brokerId、purgeInterval、reaperEnabled和timerEnabled,其中purgeInterval用于控制删除线程移除Bucket中的过期延迟请求的频率。文章通过深入分析分层时间轮的实现原理和SystemTimer类的关键代码,帮助读者理解Kafka中DelayedOperation机制的技术特点和实现细节。 DelayedOperationPurgatory还定义了两个内置类,分别是Watchers和WatcherList。Watchers是基于Key的一个延迟请求的监控链表,而WatcherList是一组按照Key分组的Watchers对象。DelayedOperationPurgatory类的两个重要方法tryCompleteElseWatch和checkAndComplete分别用于尝试完成延迟请求或检查并完成给定Key所在的WatcherList中的延迟请求。这些方法共同实现了Broker端对于延迟请求的处理,将无法立即完成的请求放入Purgatory缓冲区,后续由DelayedOperationPurgatory类的方法自动处理这些延迟请求。 总的来说,了解Kafka中DelayedOperation机制的实现原理和代码实现对于理解分布式系统的异步循环操作和管理定时任务具有重要意义。文章通过深入解析分层时间轮的实现原理和SystemTimer类的关键代码,帮助读者掌握了Kafka中DelayedOperation机制的技术特点和实现细节。
《Kafka 核心源码解读》,新⼈⾸单¥59
全部留言(9)
- 最新
- 精选
- 胡夕置顶你好,我是胡夕。我来公布上节课的“课后讨论”题答案啦~ 上节课,咱们结合源码重点了解了Kafka定时器背后的时间轮算法实现。课后我请你思考这样一个问题:TimingWheel类中的overflowWheel变量为什么是volatile型的。overflowWheel表示上一层的时间轮对象。我们在课程里面说过,上一层时间轮是按需创建的,它可能被两个并发的线程同时访问。一个线程更新该字段,另一个线程读取它,因此代码声明该字段是volatile型以保证它的内存可见性。 okay,你同意这个说法吗?或者说你有其他的看法吗?我们可以一起讨论下。2020-06-151
- J.Smile读第一遍,一脸懵逼,哈哈。看来来得多多读几遍!
作者回复: 嗯,DelayedOperation是我个人觉得最难的一部分源码,当初我也是看了好几遍。
2020-07-071 - 伯安知心大概意思就是说 到了purgeInterval这个清除间隔的数量,就会清理watcherLists中已经完成但是一直被监听的触发器个数,而且这个purged 就是已经完成但是还未清理的任务数量。purgeCompleted 进行remove。大概意思就是说 到了purgeInterval这个清除间隔的数量,就会清理watcherLists中已经完成但是一直被监听的触发器个数,而且这个purged 就是已经完成但是还未清理的任务数量。purgeCompleted 进行remove。
作者回复: 嗯,是这回事
2020-06-091 - Geek_bd613f延迟任务在文件中是怎么组织的呢
作者回复: 您指的组织是什么含义?
2020-12-20 - Kvicii.YaddTimerTaskEntry这个方法的是不是未过期并且未被取消什么也不做吧;
作者回复: 嗯,是的
2020-07-12 - 可达猫老师好,我们最近遇到了一个就是扩容 kafka broker 的问题,之前有 3 台 broker,这两天新增了一台 broker,然后执行 Reassign Partitions(数据量比较大),但是经过了 36 个小时了,Reassign Partitions 状态一直是 pending,没有结束。不知道老师遇到过这种问题没有
作者回复: 先查看下日志吧,别有什么异常导致卡住了。另外如果数据量大的话,其实建议一个分区一个分区的来
2020-06-102 - z.l核心就是一边往时间轮里面加任务,一边在外部死循环调用delayQueue.poll(timeout)方法来触发时间轮的tick,推进时间轮往前走。感觉还是Netty实现的时间轮简单点,bucket可以复用,不过netty是自己实现的时间轮推进。2022-09-08归属地:上海
- 成电帅才老师好,DelayedOperationPurgatory会管理延迟请求,这里的延迟请求和timewheeling中的延迟请求是不是同一个对象?还有就是为什么要分两个地方保存这份数据?2021-11-22
- 柠檬C老师,purgatory中既由watcherList和watcher组成的监听链表,又有Timer这个时间轮相关组件 我感觉它们都起到监听延迟请求,并重试的作用,请问它们的区别是啥呢2021-04-14