当前位置: 首页 > news >正文

【车联网kafka】用钟表齿轮理解 Kafka 时间轮​(第七篇)

        老式座钟里藏着 Kafka 时间轮的秘密。当你拆开钟面,会看到三个嵌套的齿轮:秒针齿轮(60 个齿)、分针齿轮(60 个齿)、时针齿轮(12 个齿)。每个齿轮的转动都带动着上层齿轮,就像 Kafka 的层级时间轮,用精巧的联动机制处理从毫秒到小时的定时任务。​

一、基础齿轮:秒针的精准跳动​

        秒针齿轮有 60 个齿(wheelSize=60),每齿代表 1 秒(tickMs=1s),转一圈刚好 60 秒(interval=60×1=60s)。齿轮边缘刻着 0-59 的数字,就像时间轮的格子编号。​

早上 7 点整(currentTime=0),你给座钟设置三个定时任务:​

  • 3 秒后响铃(任务 A,延时 3s)​
  • 15 秒后亮灯(任务 B,延时 15s)​
  • 50 秒后报时(任务 C,延时 50s)​

机械师是这样安放任务的:​

  1. 任务 A:3 ÷ 1 = 3 → 放在第 3 齿的挂钩上​
  1. 任务 B:15 ÷ 1 = 15 → 放在第 15 齿的挂钩上​
  1. 任务 C:50 ÷ 1 = 50 → 放在第 50 齿的挂钩上​

        秒针开始转动,每过 1 秒跳 1 齿(currentTime+1)。当秒针指向 3 时,第 3 齿的挂钩触发,铃铛响起;指向 15 时,灯泡亮起;指向 50 时,报时装置启动。这就是基础时间轮的工作原理 —— 用固定格子存放任务,指针到点触发。​

二、层级联动:分针如何带动时针​

        当你要设置一个 2 分钟(120 秒)后启动的任务 D,秒针齿轮就不够用了(最大 60 秒)。这时候分针齿轮开始工作:​

  • 分针齿轮每齿代表 60 秒(= 秒针齿轮的 interval),60 个齿刚好 3600 秒(1 小时)​
  • 任务 D 的延时 120 秒 ÷ 60 秒 / 齿 = 2 齿 → 挂在分针第 2 齿​
  • 同时记录 "剩余 0 秒"(120 % 60 = 0)​

        秒针转完 2 圈(120 秒)时,分针刚好跳 2 齿。此时机械装置会把任务 D 从分针第 2 齿摘下,放进秒针齿轮的第 0 齿。因为剩余时间为 0,秒针一到 0 点就触发任务。​

如果再设置一个 90 秒的任务 E:​

  1. 90 秒超过秒针范围,交给分针​
  1. 90 ÷ 60 = 1 齿(商),90 % 60 = 30 秒(余数)​
  1. 挂在分针第 1 齿,备注 "剩余 30 秒"​

        当分针跳 1 齿(60 秒后),任务 E 被摘下,放进秒针第 30 齿。30 秒后秒针到位,任务触发。这种 "上层粗调度 + 下层细调度" 的机制,完美解决了单个齿轮无法处理长延时的问题。​

三、跨层级流转:3 小时 15 分 30 秒的任务​

现在要设置一个 3 小时 15 分 30 秒(11730 秒)后运行的任务 F,看看三个齿轮如何协作:​

第一步:时针齿轮接棒​

  • 时针齿轮每齿代表 3600 秒(= 分针齿轮的 interval),12 个齿覆盖 43200 秒(12 小时)​
  • 11730 ÷ 3600 = 3 齿(商),11730 % 3600 = 930 秒(余数)​
  • 任务 F 挂在时针第 3 齿,备注 "剩余 930 秒"​

第二步:降级到分针​

当时针转 3 齿(3×3600=10800 秒后),任务 F 被摘下:​

  • 剩余 930 秒 ÷ 60 = 15 齿(商),930 % 60 = 30 秒(余数)​
  • 挂在分针第 15 齿,备注 "剩余 30 秒"​

第三步:降级到秒针​

当分针转 15 齿(15×60=900 秒后),任务 F 再次被摘下:​

  • 剩余 30 秒直接挂在秒针第 30 齿​

第四步:最终触发​

        30 秒后秒针到位,任务 F 执行。整个过程中,每个齿轮只负责自己范围内的调度,到点后就把任务交给下层齿轮,既不用扩大齿轮尺寸,又能精准处理长时间延时。​

四、为什么比普通定时器好?​

        如果用老式发条定时器(类似 JDK 的 Timer)处理 1000 个不同延时的任务,需要 1000 个发条,既占空间又难维护。而时间轮就像座钟的齿轮组:​

  • 用 3 个齿轮就能处理 0-12 小时的所有任务(空间效率高)​
  • 齿轮转动时批量处理同时间点的任务(时间效率高)​
  • 新增任务只需计算位置挂上挂钩(插入效率高)​

        Kafka 的时间轮正是这样工作的:基层轮处理毫秒级任务,上层轮处理分钟 / 小时级任务,指针每跳动一次就带动上层轮,到点的任务自动降级到下层,最终在合适的时间触发。就像座钟无论走多久,永远只需要那几个齿轮,却能准确报时千百万次。​

        当你下次听到座钟的滴答声,或许会想起 Kafka 的时间轮 —— 那些在服务器里默默转动的 "齿轮",正用同样的原理,精准调度着千万个延时任务。

http://www.lryc.cn/news/620973.html

相关文章:

  • PlantSimulation知识点2025.8.14
  • pycharm远程连接服务器跑实验详细操作
  • 云计算-Docker Compose 实战:从OwnCloud、WordPress、SkyWalking、Redis ,Rabbitmq等服务配置实例轻松搞定
  • UML函数原型中stereotype的含义,有啥用?
  • UE5 C++ 删除文件
  • 4.Ansible部署文件到主机
  • 配置docker pull走http代理
  • 【网络】HTTP总结复盘
  • 河南萌新联赛2025第(五)场:信息工程大学补题
  • TensorFlow深度学习实战(32)——深度Q网络(Deep Q-Network,DQN)
  • Azure微软云内网接入问题
  • 老生常谈之引用计数:《More Effective C++》条款29
  • 位操作:底层编程利器
  • 通过网页调用身份证阅读器http websocket方法-华视电子————仙盟创梦IDE
  • Uniapp 中 uni.request 的二次封装
  • 22.Linux samba服务
  • 15、C语言预处理知识点总结
  • 18.14 全量微调实战手册:7大核心配置提升工业级模型训练效率
  • 并发编程原理与实战(二十三)StampedLock应用实战与其他锁性能对比分析
  • 深度学习ubuntu系统常用指令和技巧
  • VisDrone数据集,专为无人机视觉任务打造
  • Linux面试题及详细答案 120道(1-15)-- 基础概念
  • 9.【C++进阶】继承
  • 开源数据发现平台:Amundsen 快速上手指南
  • 微服务、分布式概念-以及集群部署 vs 分布式部署
  • C# LINQ 全面教程:从入门到精通
  • 【19-模型训练细节 】
  • Linux 编译过程中遇到 TMPDIR 空间不足的问题
  • 算法应用上新!自适应更新策略差分进化算法求解球形多飞行器路径规划问题,附完整MATLAB代码
  • 智慧城市SaaS平台/专项管理系统