✅什么是时间轮?

一、问题解析

时间轮算法(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.hqwc.cn/news/703823.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Invalid bound statement (not found) 六种解决方法

前五种参考博文: Invalid bound statement (not found) 五种解决方法-CSDN博客 第六种: 在启动类上加上MapperScan,指定扫描包

web前端框架设计第八课-表单控件绑定

web前端框架设计第八课-表单控件绑定 一.预习笔记 1.v-model实现表单数据双向绑定 2.搜索数据的实现 3.全选案例实现1—JQ方法 4.单选案例实现 5.数据级联(二级级联) 6.v-model中的修饰符 二.课堂笔记 三.课后回顾 –行动是治愈恐惧的良药&#xff0c…

DolphinScheduler(海豚调度)- docker部署实战

1.官方文档 https://dolphinscheduler.apache.org/zh-cn/docs/3.2.1/guide/start/docker 2.docker环境安装 版本情况(这个地方踩了不少坑):docker-26.1.2,docker-compose-v2.11.0。 具体可使用我上传的安装包,一键安…

C++ | string详解

1、string是什么 string是STL文档的容器之一,是一个自定义类型,是一个类,由类模板basic_string实例化出来的一个类; 类模板basic_string实例化出来了四个类,如下图所示; 实例化出的这四个类不同的是他们的编…

2024最新互联网公司工作时长排行榜出炉!

“工作时长”,是选择公司的一个非常重要的参考指标。 我们在选择一个公司的时候,除了需要关注总收入package 以外,还需要考虑这家公司的加班时长是否人性化。 我们的工作时长是周工作小时数。法定工作时间是40小时(955)。大小周通常折算为周…

银河麒麟操作系统下使用QT连接TiDB数据库开发步骤

目标:实现项目软件+硬件都运行在国产化操作系统平台上。 方法:在虚拟机中安装麒麟系统V10Sp1+Qt5.14.2+MySql8.0+TiDB软件,编译MySql驱动,测试连接TiDB数据库项目。 步骤: 1、使用虚拟机软件VMWare安装银河麒麟操作系统。 2、在银河麒麟系统上安装QT5.14.2软件。 3、…

2024一站式解决 python打包代码,发布到pypi

2024一站式解决 python打包代码,发布到pypi 文章目录 2024一站式解决 python打包代码,发布到pypi一、前言二、pypi账户注册与配置2.1 账户注册2.2 双因素认证2.3 API token生成 三、代码打包3.1 准备代码3.2 编写setup.py文件3.3 LICENSE3.3.1 常见的开源…

邦注科技 工业冷水机的风冷和水冷的区别介绍

工业冷水机在工业生产中扮演着重要角色,特别是在需要精确控制温度的应用中。风冷式冷水机和水冷式冷水机是两种常见的类型,它们之间存在一些显著的区别。 热交换的来源不同: 风冷式冷水机:热交换的来源是气体。它采用空气冷却方…

三方库移植之NAPI开发[2]C/C++与JS的数据类型转

通过NAPI框架进行C/C与JS数据类型的转换 OpenHarmony NAPI将ECMAScript标准中定义的Boolean、Null、Undefined、Number、BigInt、String、Symbol和Object八种数据类型,以及函数对应的Function类型,统一封装成napi_value类型,下文中表述为JS类…

rocketmq的存储和检索

messageId是rocketmq自动生成的。