Kafka 一些组件的命名很是有趣,比如炼狱(purgatory)、死神(reaper)等,在日常开发中也建议大家在类和方法命名上能够以一些能够表达类或方法意图的人或事物的名词进行命名,让项目显得更加的生动。今天我们要分析的组件就是以 purgatory 命名的 DelayedOperationPurgatory,DelayedOperationPurgatory 是一个相对独立的组件,我们可以将其抽取出来用于自己的日常项目中,DelayedOperationPurgatory 主要用于管理延时任务,底层依赖于分层时间轮算法实现。
说到延时任务调度,对于 java 开发者来说,日常用到比较多的可能是 JDK 自带的 Timer、ScheduledThreadPoolExecutor 和 DelayQueue 等,但是对于 Kafka 这类需要频繁执行复杂延时任务的分布式系统来说,这些组件在性能上还稍显不足,所以 Kafka 自定义了分层时间轮算法,提供了 O(m)
时间复杂度(m 为时间轮层级数)的任务插入性能和 O(1)
时间复杂度的任务删除性能,要优于 JDK 自带的基于堆实现的 O(log(n))
时间复杂度的延时任务调度组件。