【018】Dubbo3从0到1系列之时间轮流程图解

文章目录

  • Dubbo3时间轮
      • [7.2.8 HashedWheelTimer图解](#7.2.8 HashedWheelTimer图解)
        • [✅ 1. 架构图](#✅ 1. 架构图)
        • [✅ 2. 初始化流程图](#✅ 2. 初始化流程图)
        • [✅ 3. 添加定时任务流程图](#✅ 3. 添加定时任务流程图)
        • [✅ 4. Worker 线程处理流程图](#✅ 4. Worker 线程处理流程图)
        • [✅ 5. 任务转移流程图](#✅ 5. 任务转移流程图)
        • [✅ 6. 任务到期处理流程](#✅ 6. 任务到期处理流程)
        • [✅ 7. 时间轮工作时序图](#✅ 7. 时间轮工作时序图)
        • [✅ 8. 任务取消时序图](#✅ 8. 任务取消时序图)
      • [7.2.9 举例说明](#7.2.9 举例说明)

Dubbo3时间轮

7.2.8 HashedWheelTimer图解

✅ 1. 架构图
✅ 2. 初始化流程图
✅ 3. 添加定时任务流程图
✅ 4. Worker 线程处理流程图
✅ 5. 任务转移流程图
✅ 6. 任务到期处理流程
✅ 7. 时间轮工作时序图

Application HashedWheelTimer Worker Thread HashedWheelBucket newTimeout(task, delay, unit) 创建 HashedWheelTimeout 加入 timeouts 队列 返回 Timeout start() 启动 Worker 线程 waitForNextTick() processCancelledTasks() 处理 cancelledTimeouts 队列 transferTimeoutsToBuckets() 从 timeouts 队列取出任务 根据 deadline 计算并添加到对应桶 expireTimeouts() 遍历桶内任务 处理到期任务 (remainingRounds<=0) 执行 TimerTask.run() 更新未到期任务 (remainingRounds--) loop 每个 tick 周期 Application HashedWheelTimer Worker Thread HashedWheelBucket

✅ 8. 任务取消时序图

Application HashedWheelTimer HashedWheelTimeout Worker Thread timeout.cancel() CAS 设置状态为 ST_CANCELLED 加入 cancelledTimeouts 队列 返回 true processCancelledTasks() 从 cancelledTimeouts 取出任务 timeout.remove() 从桶中移除自己 减少 pendingTimeouts 计数 Application HashedWheelTimer HashedWheelTimeout Worker Thread

这些图表展示了 HashedWheelTimer 的核心工作机制,包括初始化过程、任务添加、任务处理以及任务取消等关键环节。整体设计采用了生产者-消费者模式,通过队列解耦了任务提交和任务处理的过程,并利用时间轮算法优化了大量定时任务的管理效率。

7.2.9 举例说明

  1. 用户提交一个延迟为 T = 300 秒(5 分钟) 的任务;
  2. 计算总 tick 数:totalTicks = T / tickDuration = 300_000ms / 100ms = 3000 ticks. (时间轮的指针,是一个步长为 1 的单调递增计数器)
  3. 由于 wheel 只有 512 个槽,计算:
    • remainingRounds = totalTicks / ticksPerWheel = 3000 / 512 ≈ 5 轮
      • remainingRounds ,剩余的轮数
    • stopIndex = (currentTick + totalTicks) % ticksPerWheel
      • 某个槽位停止下来
  4. 将任务封装为 HashedWheelTimeout,记录ticksPerWheel
  5. 时间轮工作线程每 tick 一次:
    • 当指针到达 stopIndex 时,检查该槽位所有任务;
    • 若 remainingRounds > 0,则 remainingRounds--不执行任务,继续等待下一轮;
    • 直到 remainingRounds == 0,才真正执行任务。

✅ 这就是 "多轮计数"机制,无需多级时间轮,也能支持任意长时间任务。

🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉

  • Enjoy it

🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉

相关推荐
小马架构19 小时前
Dubbo从入门到实践
dubbo
++==2 天前
RPC:grpc的使用与安装、server和client的使用示例、lsb_relese、自定制协议(LVC)+protobuf的RPC调用框架的实现
网络·网络协议·rpc
2601_965235482 天前
快速了解docker
docker·容器·dubbo
码匠许师傅3 天前
【设计模式精讲】21.迭代器模式(Iterator)
c++·设计模式·rpc·迭代器模式·软件工程·uml
天天喝旺仔3 天前
gRPC 流式通信实战:从一元调用到双向流,吃透四种 RPC 模式(Go 版)
分布式·http·微服务·rpc·go
可爱系程序猿6 天前
添加网络打印机提示 0x000006ba:从 RPC 服务、Print Spooler 到主机发现排查
网络·网络协议·rpc
可爱系程序猿7 天前
Windows 11 添加共享打印机提示 0x00000bc4:从 RPC 发现到策略配置排查
windows·网络协议·rpc
互联网中的一颗神经元10 天前
09. mheap:全局堆管理器
java·spring·dubbo
Patrick_Wilson11 天前
RPC 与 REST 的本质区别看这一篇就够了:别再只看 URL 里有没有动词
http·rpc·restful
catino11 天前
spring-IOC、DI
java·spring·rpc