✅什么是时间轮?

news2024/12/25 23:59:38

一、问题解析

时间轮算法(Time Wheel Algorithm)是一种用于处理定时任务和调度的常见算法。

时间轮算法主要需要定义一个时间轮盘,在一个时间轮盘中划分出多个槽位,每个槽位表示一个时间段,这个段可以是秒级、分钟级、小时级等等。如以下就是把一个时间轮分为了60个时间槽,每一个槽代表一秒钟。

image.png



然后当我们有定时任务需要执行的时候,就把他们挂在到这些槽位中,这个任务将要在哪个槽位中执行,就把他挂在到哪个槽位的链表上。

比如当前如果是0秒,那么要3秒后执行,那就挂在槽位为3的那个位置上。

 

image.png



而随着时间的推移,轮盘不断旋转,任务会被定期触发。

因为这个时间轮是60个槽位,那么他就会在一分钟完整的转完一圈,那么就有一个指针,每一秒钟在槽位中进行一次移动。这个操作是有一个单独的线程来做的,他的工作就是每一秒钟改变一次current指针。

image.png



然后还有一个线程池,在指针轮转到某个槽位上的时候,在线程池中执行链表中需要执行的任务。

以上就是一个简单的时间轮算法,但是这个时间轮存在一个问题,那就是我们把它分了60个槽,那么就意味着我们的定时任务最多只支持60s以内的。

那么,怎么解决这个问题呢?

首先能想到的最简单的方式就是加槽位,比如我要支持5分钟的延迟任务,那么就可以把槽位设置为300个。

还有就是也可以调整时间轮槽位移动的延迟,比如把1秒钟移动一次,改为1分钟移动一次,那么就可以支撑60分钟的延迟任务了。

但是这两个办法都不够灵活,而且是有瓶颈的。于是有一种新的办法。

round

在时间轮中增加一个round的标识,标识运行的圈数,比如说上面的60s的时间轮,如果我要200s之后运行,那么我在设置这个任务的时候,就把他的round设置为 200/60 = 3 ,然后再把它放到 200%60 = 20的这个槽位上。

image.png



有了这个round之后,每一次current移动到某个槽位时,检查任务的round是不是为0,如果不为0,则减一。

image.png



这样时间轮转到第三圈时,round的值会变成0,再第四圈运行到current=20的时候,发现round=0了,那么就可以执行这个任务了。

这样就解决了我们前面说的问题了。

但是这个方案还存在一个问题,那就是这个round的检查过程,需要把所有任务都遍历一遍,效率还是没那么高。

分层时间轮

为了解决遍历所有任务的问题,我们可以引入分层时间轮。我们在刚刚的秒级时间轮的基础上,在定义一个分钟级时间轮

image.png



也就是说我们对于200s以后执行这个任务,我们先把他放到分钟级时间轮上,这个时间轮的槽位每一分钟移动一次,当移动时候,发现某个槽位上有这一分钟内需要执行的任务时。

把这个任务取出来,放到秒级时间轮中。这样在第3分20秒的时候,就可以运行这个任务了。

这就是分层时间轮。在分层时间轮包括多个级别的时间轮,每个级别的时间轮都有不同的粒度和周期。

通常,粒度较细的时间轮拥有更短的周期,而粒度较粗的时间轮拥有更长的周期。例如,分层时间轮可以包括毫秒级、秒级、分钟级等不同粒度的时间轮。

当一个任务需要被调度时,它被分配到适当级别的时间轮中,每个级别的时间轮都独立地旋转。当一个时间轮的指针到达某个位置时,它将触发执行该级别时间轮中的任务。如果某个任务在较粗的时间轮中已经到期,它将被升级到下一级时间轮。

当任务升级到下一级时间轮时,任务的调度粒度变得更细。这意味着任务将在更短的时间内被触发,从而更精确地满足其调度要求。


扩展知识

典型应用

时间轮算法在各种框架和库中都有广泛的应用。以下是一些应用时间轮算法的常见框架和库:

1Netty:Netty 是一款高性能的网络通信框架,它使用时间轮算法来处理定时任务和超时检测。时间轮用于管理通道的超时和重连机制。
2Akka:Akka 是一个并发编程框架,它包括一个调度器,该调度器使用时间轮算法来管理和触发并发任务。这使得 Akka 能够支持高并发和复杂的任务调度需求。
3Kafka:Apache Kafka 是一个分布式消息队列系统,它使用时间轮算法来管理消息的过期和删除。时间轮用于清理过期消息,以释放存储空间。
4Hystrix:Hystrix 是 Netflix 开发的容错和延迟容忍库,它使用时间轮来管理命令执行和熔断状态的转换。
5Disruptor:Disruptor 是一个高性能并发框架,它使用时间轮算法来管理任务的并发执行,以提高处理大量事件的性能。
6xxl-job:在以前的版本的xxl-job中,使用quartz做定时任务调度,但是在7.28版本中去除了quartz,改用了时间轮算法。

9,代码优化,CONCURENTHASHMAP变量类型改为CONCURRENTMAP,避免因不同版本实现不同导致的兼容性问题;

12,项目依赖升级至较新稳定版本,如SPRING,SPRINGBOOT,GROOY,X-RPC等等;并清理冗余POM;

,权限管理:执行器维度进行权限控制,管理员拥有全量权限,普通用户需要分配执行器权限后才允许相关操

13,升级X-RPC至较新版本,修复代理服务初始化时远程服务不可用导致长连几余创建的问题;

,任务日志主键调整为LONG数据类型,防止海量日志情况下数据溢出;

底层线程模型重构:移除QUARTZ线程池,降低系统线程与内存开销

7.27版本V2.1.0RELEASENOTES[2019-07-07]

16,调度组件销毁流程优化,先停止调度线程,然后等待时间轮内存量任务处理完成,最终销时间轮线程;

,用户管理:支持在线管理系统用户,存在管理员,普通用户两种角色;

,自研调度组件,移除QUAZ依赖:一方面是为了精简系统降低几余依赖,另一方面是为了提供系统的可控度与稳定性;

8,HTTPJOBHANDLER优化,响应数据指定UTF-8格式,避免中文乱码;

调度:集群竞争,负载方式协同处理,锁竞争-更新触发信息-推送时间轮锁释放-锁竞争;

,任务列表优化,支持根据"任务状态","负责人"属性筛选任务

,底层表结构重构:移除11张QUARTZ相关表,并对现有表结构优化梳理;

14,首页调度报表的日期排序在TIDB下乱序问题修复;

7,执行器回调线程优化,回调地址为空时销毁问题修复;

5,调度中心与执行器双向通讯超时时间调整为3S;

11,任务日志列表交互优化,操作按钮合并为分割按钮;

触发:单节点周期性触发,运行事件如DELAYQUEUE;

9,新增BOOT执行器SAMPLE示例项目

,注册表索引优化,缓解锁

,调度线程池参数调优;

image.png

二、粉丝福利

我是浮生,一个工作十四年经验的Java程序员!

最近很多同学问我有没有java学习资料,我根据我从小白到架构师多年的学习经验整理出来了一份80W字面试解析文档、简历模板、学习路线图、java必看学习书籍 、 需要的小伙伴 可以关注我
公众号:“ 
灰灰聊架构 ”, 回复暗号:“ 321 ”即可获取

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1679255.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv8改进教程|加入可改变核卷积AKConv模块,效果远超DSConv!

⭐⭐ YOLOv8改进专栏|包含主干、模块、注意力机制、检测头等前沿创新 ​ ⭐⭐ 一、 论文介绍 论文链接:https://arxiv.org/abs/2311.11587 代码链接:GitHub - CV-ZhangXin/AKConv 论文速览::AKConv是2023年11月发表的一种可变卷积…

【Linux——Centos7安装RabbitMQ】 RabbitMQ无法连接

到这一步是基本已经装好了,现在是在开放端口,我这个报错是因为我的防火墙是处于关闭状态,所以在开放端口时会报防火墙为运行,把防火墙打开,在开放端口,就可以访问到了 重启防火墙: systemctl …

白酒:酒精度数对白酒风味的影响与品鉴技巧

云仓酒庄豪迈白酒作为品质的白酒品牌,其酒精度数对白酒风味的影响与品鉴技巧是品鉴爱好者关注的重点。酒精度数作为衡量白酒质量的一项重要指标,不仅决定了白酒的口感和风格,更在一定程度上体现了白酒的品质和价值。本文将探讨酒精度数对云仓…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.6讲 GPIO中断实验-GPIO驱动添加中断处理函数

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

2024年第十届中西部外语翻译大赛

2024年第十届中西部外语翻译大赛 竞赛信息 “由中西部翻译协会共同体指导发起,各省市译协共建学术指导委员会,2024年第十届中西部外语翻译大赛由中西部翻译协会共同体秘书处(武汉公仪网络科技有限公司)承办。” - 获奖证书样图 -…

MQTT_服务器的安装_1.3

此例子是以Windows系统安装开源版本的EMQX 下载 EMQX 下载并解压 解压如图 进入bin 文件夹在文件目录中输入cmd回车 启动服务器 然后在cmd中输入下面的代码(会弹出一个访问网络的选项,确认可以访问网络) emqx start 结果如图(…

半小时搞懂STM32知识点——UART

1.UART 1.1为什么要使用UART这种协议?介绍一下UART及其特点 成本低,硬件简单,数据格式灵活; 低速全双工异步串行通信 1.2 UART数据帧格式? 起始位(1)+数据位(5-8) 校验位…

百面算法工程师 | YOLOv6面试考点原理全解析

本文给大家带来的百面算法工程师是深度学习目标检测YOLOv6面试总结,文章内总结了常见的提问问题,旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中,我们还将介绍一些常见的深度学习目标检测面试问题,并提供参考的回答…

项目管理—需求管理规程(软件研发过程标准,管理标准,标书技术编写,资质评审,安全管理体系,项目交付,实施运维,各类建设方案)

软件资料清单列表部分文档清单:工作安排任务书,可行性分析报告,立项申请审批表,产品需求规格说明书,需求调研计划,用户需求调查单,用户需求说明书,概要设计说明书,技术解…

GPT-4o 引领人机交互新风向,向量数据库赛道沸腾了

OpenAI 发布 ChatGPT-4o,意味着人机交互进入新的时代。Chat-GPT4o 是一个跨文本、视觉和音频端到端训练的新模型,所有输入和输出都由同一个神经网络处理。这也在告诉所有人,GenAI 连接非结构化数据,非结构化数据之间跨模态的交互正…

Geoserver

Geoserver GIS工具 文章目录 Geoserver前言一、Geoserver是什么?二、概念1.Geoserver结构图2.相关概念3.Geoserver相关站点4.Geoserver安装5.PostgreSQL安装1.拉取镜像2.创建挂载卷3.安装 6 Docker 环境安装postgrespostgis扩展 总结其他参考资料 前言 GeoServer&…

从开发板导出根文件系统并修改(Ubuntu)

前面提到过基于ubuntu-base去构建根文件系统基于Ubuntu-base构建根文件系统-CSDN博客,但是有时候我们并不需要重头开始,可以基于现有的根文件系统做调整。又或者我们直接在出厂的系统上去搭建好自己的运行环境并且编译出自己想要的程序,现在要…

Web浏览器的兼容性测试需要考虑哪些测试点?

测试web网站兼容性时,可以使用各种测试用例来确保网站在不同浏览器中的良好兼容性。以下是一些常见的兼容性测试用例示例: 1. 页面加载测试: - 确保网站在不同浏览器中正常加载,没有加载错误。 - 检查页面加载时间,…

Kivy UI界面

一、版本介绍 Ubuntu:18.04.6 LTS Conda:4.5.12 Python:3.6.15 Kivy:2.0.0 二、安装Kivy # 更新系统包列表 sudo apt-get update# 安装Kivy的依赖项 sudo apt-get install -y python-pip libsdl2-dev libsdl2-image-dev li…

【机器学习】:基于决策树与随机森林对数据分类

机器学习实验报告:决策树与随机森林数据分类 实验背景与目的 在机器学习领域,决策树和随机森林是两种常用的分类算法。决策树以其直观的树形结构和易于理解的特点被广泛应用于分类问题。随机森林则是一种集成学习算法,通过构建多个决策树并…

Galxe已投资Pencils Protocol,投资者阵营正不断扩大

近日,Scroll 生态项目 Penpad 将品牌进一步升级为 Pencils Protocol,全新升级后其不仅对 LaunchPad 平台进行了功能上的升级,同时其也进一步引入了 Staking、Vault 以及 Shop 等玩法,这也让 Pencils Protocol 的叙事方向不再仅限于…

“图生视频”技术创新:剪贴画秒变动画生成的实验验证与分析

在最近的研究进展中,AniClipart系统的问世标志着文本到视频生成技术的一个重要里程碑。这一系统由香港城市大学和莫纳什大学的研究者们共同开发,旨在解决将静态剪贴画图像根据文本提示自动转换成动画序列的挑战。传统的动画制作流程繁琐且耗时&#xff0…

Python 小抄

Python 备忘单 目录 1.语法和空格 2.注释 3.数字和运算 4.字符串处理 5.列表、元组和字典 6.JSON 7.循环 8.文件处理 9.函数 10.处理日期时间 11.NumPy 12.Pandas 要运行单元格,请按 ShiftEnter 或单击页面顶部的 Run(运行)。 1.语法和空格…

「每日跟读」英语常用句型公式 第15篇

「每日跟读」英语常用句型公式 第15篇 1. It’s only logical that __ 合理的做法/结论是__ It’s only logical that we should take a break (合理的做法是我们应该休息一下) It’s only logical that we work hard to make money(合理…

如何设计知识竞赛活动中的观众互动环节

知识竞赛活动过程中有多种方式进行观众互动,达到台上台下互动的效果,让台下观众参与到竞赛活动中,增加现场气氛。下面介绍几种常用观众互动环节设计方法。 一、台上选手对抗台下观众 此方案为台下观众和台上选手一起答题,如果台…