承接上文
承接上文,让我们基本上已经知道了「时间轮算法」原理和核心算法机制,接下来我们需要面向于实战开发以及落地角度进行分析如何实现时间轮的算法机制体系。
前言回顾
什么是时间轮
- 调度模型:时间轮是为解决高效调度任务而产生的调度模型/算法思想。
- 数据结构:通常由hash表和双向链表实现的数据结构。
为什么用时间轮?
对比传统队列的优势
相比传统的队列形式的调度器来说,时间轮能够批量高效的管理各种延时任务、周期任务、通知任务等等。例如延时队列/延时任务体系
延时任务/队列体系
延时任务、周期性任务,应用场景主要在延迟大规模的延时任务、周期性的定时任务等。
案例-Kafka的延时操作系列
比如,对于耗时的网络请求(比如Produce时等待ISR副本复制成功)会被封装成DelayOperation进行延迟处理操作,防止阻塞Kafka请求处理线程,从而影响效率和性能。
传统队列带来的性能问题
Kafka没有使用传统的队列机制(JDK自带的Timer+DelayQueue实现)。因为时间复杂度上这两者插入和删除操作都是 O(logn),不能满足Kafka的高性能要求。
基于JDK自带的Timer+DelayQueue实现
JDK Timer和DelayQueue底层都是个优先队列,即采用了minHeap的数据结构,最快需要执行的任务排在队列第一个,不一样的是Timer中有个线程去拉取任务执行,DelayQueue其实就是个容器,需要配合其他线程工作。