组件

DelayedOperationPurgatory 组件 #

Timing Wheel #

Kafka 的时间轮实现是 TimingWheel,它是一个存储定时任务的环形队列,底层使用数组实现,数组中的每个元素可以存放一个 TimerTaskList 对象。TimerTaskList是环形双向链表,链表项 TimerTaskEntry中封装了真正的定时任务 TimerTask。 TimerTaskList 使用 expiration 字段记录了整个 TimerTaskList 的超时时间

结构 #

SystemTimer #

SystemTimer 是 Kafka 中的定时器实现,它在 TimeWheel 的基础上添加了 执行到期任务、阻塞等待最近到期任务的功能

DelayedOperation #

服务端在收到 ProducerRequest 和 FetchRequest 两种请求时,并不是立即返回相应,可能会等待一段时间后才返回。
对于 ProducerRequest :
acks 设置为 -1: ProducerRequest 发送到 Leader 副本之后,需要 ISR 集合中所有副本都同步该请求中的消息(或超时)后,才能返回响应给客户端

Kafka 利用 SystemTimer 来定期检测请求是否超时,但是这些请求真正的目的并不是为了超时执行,而是为了满足其他条件后执行
例如 ProducerRequest 的响应条件 ISR 集合中所有副本都同步了请求中的消息,所以仅使用 SystemTimer 就无法满足需求
DelayedOperation 抽象类表示延迟操作,它对 TimeTask 进行了扩展,除了有定时执行的功能,还提供了检测其他执行条件的功能

DelayedOperation 结构 #

DelayedOperationPurgatory #

提供管理 DelayedOperation 以及处理到期 DelayedOperation 的功能

DelayedProduce #

ProducerRequest acks字段为-1时,服务端的处理流程 #

结构 #

DelayedProduce 初始化 #

DelayedFetch #

DelayedFetch 是 FetchRequest 对应的延迟操作