当前位置: 首页 > 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.dtcms.com/a/331605.html

相关文章:

  • Java应用快速部署Tomcat指南
  • # 2025全球AI游戏市场研究报告:行业洞察与未来趋势
  • OpenAI 的浏览器将使用 ChatGPT Agent 来控制浏览器
  • 亚马逊FCF计划:破解高单价产品转化困局的金融杠杆
  • RH134 管理基本存储知识点
  • 考研408《计算机组成原理》复习笔记,第四章(1)——指令系统概念(指令字长、N地址指令、定长和变长操作码)
  • H.264编码格式详解:Annex-B vs AVCC
  • 14、Docker Compose 安装 Redis 集群(三主三从)
  • 嵌入式学习笔记--MCU阶段--DAY12实时操作系统rt_thread1
  • Cypher注入详解:原理、类型与测试方法
  • 使用免费API开发口播数字人
  • 数智化与全球化,双轮驱动艾芬达持续引领行业变革
  • 嵌入式 - Linux软件编程:进程
  • PIDGenRc函数中lpstrRpc的由来和InitializePidVariables函数的关系
  • 什么是期权ETF分仓的意思呢?
  • 安全加固4(K8S最小化微服务安全)
  • java-JVM详解
  • 如何安装 scikit-learn Python 库
  • Azure微软云内网接入问题
  • 大规模调用淘宝商品详情 API 的分布式请求调度实践
  • ant design vue pro 1.7.8 自定义渲染菜单,多页签,keep-alive 详细教程 vue2.x版
  • day33-LNMP
  • PostgreSQL——视图
  • 六十五、【Linux数据库】MySQL表结构 、 MySQL键值
  • 重学JS-003 --- JavaScript算法与数据结构(三)JavaScript 基础调试方法
  • Codeforces 1042 Div3(ABCDEFG)
  • 【科研日常】使用tensorflow实现自注意力机制和交叉注意力机制
  • Java中Record的应用
  • Flink Stream API 源码走读 - socketTextStream
  • Spark Shuffle机制原理