✅什么是时间轮?

一、问题解析

时间轮算法(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.mzph.cn/pingmian/12780.shtml

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

相关文章

数据结构(十五)----排序算法(2)

目录 一.选择排序 1.简单选择排序 2.堆排序 •建立大根堆 •基于大根堆进行排序 堆排序算法效率: 堆排序算法稳定性: 3.堆的插入和删除 •在堆中插入新元素 •在堆中删除元素 二.归并排序 归并排序算法效率: 归并排序算法的稳定…

Reverst:基于QUIC协议和HTTP3的反向隧道工具

关于Reverst Reverst是一款功能强大的反向隧道工具,Reverst由一个具备负载均衡功能的反向隧道服务器和一个服务器-客户端库组成,该工具使用Go语言开发,基于QUIC和HTTP/3实现其功能。 关于QUIC和HTTP/3 QUIC,即快速UDP互联网连接…

队列的实现与OJ题目解析

"不是你变优秀了, 那个人就会喜欢你." 文章索引 前言1. 什么是队列2. 队列的实现3. OJ题目解析4. 总结 前言 感情可以培养是个伪命题. 如果有足够多的时间和爱, 就可以让另一个人爱上你的话, 那谁和谁都可以相爱了. 爱情之所以会让人死去活来, 是因为, 答案都写在了…

photoshop(PS)有什么快速提升工作效率的功能?或者实用功能?这里告诉你7条!

1:文件太多,不方便马上找到需要插入元素(元素放入PS会发现,位置不知道在哪里),点击需要选中或者搭配的元素,ctrlV就可以快速插入目标/图层元素的位置了! 点击当前元素,选中&#xf…

Linux备份---异地

参考文档:Linux环境实现mysql所在服务器定时同步数据文件到备份服务器(异地容灾备份场景)_mysql异地备份-CSDN博客 通过SSH进行连接: 应用服务器: 通过ssh-keygen -t rsay建立ssh通信的密钥 密钥建立后,…

边缘计算安全有多重要

德迅云安全研究发现边缘安全是对存储或处理在网络边缘的数据的保护。边缘可以用不同的方式定义,但一般来说,它包括企业直接控制之外的任何设备或位置。这可能包括传感器、连接物联网的设备和移动设备。 边缘计算正在彻底改变商业运作方式。这引发了对边缘…

VuePress与Docusaurus:构建高效文档站点

VuePress 和 Docusaurus 都是非常流行的开源静态站点生成器,特别适用于构建技术文档和知识库。它们都提供了美观的预设主题、易于使用的Markdown语法支持以及自动生成的导航和侧边栏。 2500G计算机入门到高级架构师开发资料超级大礼包免费送! VuePress…

维修AB罗克韦尔工控机 PanelView 900 2711-T9C8 SER C 触摸屏人机界面

可视化和 HMI 解决方案可帮助您满足生产力、创新和全球化需求。为电子操作员界面终端、分布式客户端/服务器 HMI 和信息软件提供了一致的外观和感觉。编程工具和高级软件应用程序包括远程访问和数据分析,可加速开发并提高效率。 图形终端 图形终端提供各种尺寸、操…

SpringBoot 使用logback(多环境配置)

Logback是由log4j创始人设计的又一个开源日志组件。可用于项目日志功能。官网地址 第1步&#xff1a;添加坐标依赖 <!--logback--> <dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version…

Python 提取PDF表格数据并保存到TXT文本或Excel文件

目录 安装Python库 Python提取PDF表格数据并保存到文本文档 Python提取PDF表格数据并保存到Excel文档 PDF文件常用于存储和共享各种类型的文档&#xff0c;这些文档可能包括大量的数据表格。通过提取这些PDF表格数据&#xff0c;我们可以将其导入到Excel、数据库或统计软件等…

技术架构

一、单机架构 简介&#xff1a;应用服务和数据库服务共用一台服务器 出现原因:出现在互联网早期&#xff0c;访问量比较小&#xff0c;单机足以满足 架构工作原理&#xff1a;以电商为例&#xff0c;可以看到通过应用&#xff08;划分了多个模块&#xff09;和数据库在单个服…

开发者选型:小程序原生or 小程序框架?

从2017年小程序推出以来&#xff0c;小程序的发展可谓突飞猛进。其流量入口多、易于传播且开发成本低的特性&#xff0c;使得越来越多的企业摒弃原生开发选择小程序。市场业务需求也越来越大&#xff0c;但是对于开发者来说哦&#xff0c;用原生去开发小程序很难受&#xff0c;…

C++ STL概念之 序列式容器4(bitset / array / forward_list / deque)

bitset 接口 set all bits (1) bitset& set() noexcept;single bit (2) bitset& set (size_t pos, bool val true); 用于序列中的一位或所有位设置为1。 bitset& set() noexcept; 这个版本将位序列中的所有位都设为1。 bitset& set(size_t pos, bool val …

Java 高级面试问题及答案2

Java 高级面试问题及答案 问题 1: 请解释 Java 中的多线程和并发的区别&#xff0c;并举例说明如何避免常见的并发问题。 答案&#xff1a; 多线程是指程序中有多个线程同时执行&#xff0c;而并发是指程序设计中允许多个操作看起来是同时执行的&#xff0c;即使它们可能不是…

视频智能检测AI智能分析网关V4告警消息推送:公众号消息推送的配置步骤介绍

TSINGSEE青犀智能分析网关V4属于高性能、低功耗的软硬一体AI边缘计算硬件设备&#xff0c;目前拥有3种型号&#xff08;8路/16路/32路&#xff09;&#xff0c;支持Caffe/DarkNet/TensorFlow/PyTorch/MXNet/ONNX/PaddlePaddle等主流深度学习框架。硬件内部署了近40种AI算法模型…

继承,多态,封装以及对象的打印

前言&#xff1a; 我们都知道Java是一种面向对象的编程语言&#xff0c;面向对象语言的三大特性就是继承&#xff0c;多态&#xff0c;封装&#xff0c;而这些特性正好的Java基础的一个主体内容。在学到这之前&#xff0c;我们肯定已经学习过了类和对象&#xff0c;所以这部分…

光学镜片镀膜上下料设备

在现代化工业生产的浪潮中&#xff0c;智能化、自动化已成为提升生产效率、降低成本的关键所在。特别是在精密制造领域&#xff0c;对于设备的高精度、高效率要求更是严苛。今天向大家推荐一款引领行业潮流的智能设备——富唯智能镀膜上下料设备。 产品介绍 实现功能 单面镀膜…

NGINX SPRING HTTPS证书

服务器&#xff1a;xxx.xxx.xxx.56 客户端器&#xff1a;xxx.xxx.xxx.94##生成服务器证书和密钥容器 keytool -genkey -alias tas-server -keypass 250250 -keyalg RSA -keysize 2048 -validity 3650 -keystore D:\https证书\tas-server.jks -storepass 250250 -dname "C…

IT行业的现状与未来:技术创新引领时代变革

随着技术的不断进步&#xff0c;IT行业已成为推动全球经济和社会发展的关键力量。从云计算、大数据、人工智能到物联网、5G通信和区块链&#xff0c;这些技术正在重塑我们的生活和工作方式。本文将探讨当前IT行业的现状及未来发展趋势&#xff0c;并邀请行业领袖、技术专家和创…

低成本创业分享,一个不用自己囤货、进货、直播的项目|抖音小店

大家好&#xff0c;我是喷火龙 在抖音上面开店&#xff0c;不仅可以卖自己的商品&#xff0c;还可以卖别人的商品赚差价&#xff0c; 并且不需要你囤货、进货、直播、剪视频&#xff0c;也不需要有粉丝。 这个项目就是抖音小店无货源。 很多朋友对抖音小店无货源模式的玩法…