Kafka如何实现延迟队列?

Kafka并没有使⽤ JDK⾃带的Timer或者DelayQueue来实现延迟的功能 ,⽽是基于时间轮自定义了⼀个⽤于实现延迟功能的定时器 SystemTimer )。

JDK的Timer和DelayQueue插⼊和删除操作的平均时间复杂度为O(nlog(n)),并不能满⾜Kafka的⾼性能要求,而基于时间轮可以将插⼊和删除操作的时间复杂度都降为O(1)


时间轮的应⽤并⾮Kafka独有,其应⽤场景还有很多,在NettyAkkaQuartzZookeeper等组件中都存在时间轮的踪影。底层使⽤数组实现,数组中的每个元素可以存放⼀个TimerTaskList对象。


TimerTaskList是⼀个环形双向链表,在其中的链表项TimerTaskEntry中封装了真正的定时任务TimerTask.Kafka中到底是怎么推进时间的呢?Kafka中的定时器借助了JDK中的DelayQueue来协助推进时间轮。


具体做法是对于每个使⽤到的TimerTaskList都会加⼊到DelayQueue中。Kafka中的TimingWheel专⻔⽤来执⾏插⼊和删除TimerTaskEntry的操作,而DelayQueue专⻔负责时间推进的任务。再试想⼀下,DelayQueue中的第⼀个超时任务列表的expiration为200ms,第⼆个超时任务为840ms,这⾥获取DelayQueue的队头只需要O(1)的时间复杂度。


如果采⽤每秒定时推进,那么获取到第⼀个超时的任务列表时执⾏的200次推进中有199次属于“空推进”,而获取到第⼆个超时任务时有需要执⾏639次“空推进”,这样会无故空耗机器的性能资源,这⾥采用DelayQueue来辅助以少量空间换时间,从⽽做到了“精准推进”。


Kafka中的定时器真可谓是“知⼈善⽤”,⽤TimingWheel做最擅⻓的任务添加和删除操作⽽⽤DelayQueue做最擅⻓的时间推进⼯作,相辅相成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图图是个好孩纸~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值