Kafka源码之服务端分析之DelayedOperaionPurgatory组件

本文深入分析Kafka的DelayedOperationPurgatory组件,它管理延迟操作,核心机制包括TimingWheel和SystemTimer。TimingWheel实现时间轮的基础功能,而SystemTimer在此基础上添加执行到期任务和阻塞等待功能。DelayedOperation抽象类表示延迟操作,具备定时执行及条件检查功能。DelayedOperationPurgatory则负责管理和处理到期的DelayedOperation,使用ConcurrentHashMap和内部类Watchers进行存储和管理。
摘要由CSDN通过智能技术生成

DelayedOperaionPurgatory是一个相对独立的组件,它的主要功能是管理延迟操作。
TimingWheel
我们先来看一下它的核心字段:
bukets:其中的每一项都对应这一个时间格,同一个TimerTaskList中过的不同的定时任务的到期时间可能不同,但是相差在一个时间个的范围内
tickMs:当前时间轮中一个时间格表示的时间跨度
wheelSize:当前时间轮的格数,也是buckets数组的大小
taskCounter:各层级时间轮中任务的总数
startMs:当前时间轮的创建时间
queue:整个层级时间轮共用一个任务队列,其元素类型是TimerTaskList
currentTime:时间轮指针,将整个时间轮划分为到期部分和未到期部分
interval:当前时间轮的时间跨度
overflowWheel:上层时间轮的引用
在TimeWheel里面实现了时间轮的基础功能:

def add(timerTaskEntry: TimerTaskEntry): Boolean = {
    val expiration = timerTaskEntry.expirationMs

    if (timerTaskEntry.cancelled) {
      //当前任务被取消
      false
    } else if (expiration < currentTime + tickMs) {
      // 任务已到期
      false
    } else if (expiration < currentTime + interval) {
      // 任务在当前时间跨度范围内,放到指定的桶里面
      val virtualId = expiration / tickMs
      val bucket = buckets((virtualId % wheelSize.toLong).toInt)
      bucket.add(timerTaskEntry)
      // 重新设置当前桶的到期时间
      if (bucket.setExpiration(virtualId * tickMs)) {
        //将当前桶添加到DelayQueue中
        queue.offer(bucket)
      }
      true
    } else {
      // 任务的到期时间超过了当前时间轮的到期时间,将它交给上级时间轮来处理
      if (overflowWheel == null) addOverflowWheel()
      overflowWheel.add(timerTaskEntry)
    }
  }
private[this] def addOverflowWheel(): Unit = {
    synchronized {
    	//如果上级时间轮为空,那么就创建一个
      if (overflowWheel == null) {
        overflowWheel = new TimingWheel(
          tickMs = interval,
          wheelSize = wheelSiz
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值