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 对应的延迟操作