幼儿饰品瑜伽美体用品微软
投稿投诉
微软创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

非常详细通过时间轮(TimingWheel)实现延时队列的原

  时间轮的介绍
  时间轮(TimeWheel)是一种实现延迟功能(定时器)的精妙的高级算法,其算法应用范围非常广泛,在Java开发过程中常用的Dubbo、Netty、Akka、Quartz、ZooKeeper、Kafka等各种框架中,各种操作系统的定时任务crontab调度都有用到,甚至Linux内核中都有用到,不夸张的是几乎所有和时间任务调度都采用了时间轮的思想。时间轮的作用高效处理批量任务
  时间轮可以高效的利用线程资源来进行批量化调度,把大批量的调度任务全部都绑定时间轮上,通过时间轮进行所有任务的管理,触发以及运行。降低时间复杂度
  时间轮算法可以将插入和删除操作的时间复杂度都降为O(1),在大规模问题下还能够达到非常好的运行效果。高效管理延时队列
  能够高效地管理各种延时任务,周期任务,通知任务等,相比于JDK自带的Timer、DelayQueueScheduledThreadPool来说,时间轮算法是一种非常高效的调度模型。缺点:时间精确度的问题
  时间轮调度器的时间的精度可能不是很高,对于精度要求特别高的调度任务可能不太适合。因为时间轮算法的精度取决于时间段指针单元的最小粒度大小,比如时间轮的格子是一秒跳一次,那么调度精度小于一秒的任务就无法被时间轮所调度。
  精度问题我们可以考虑后面提出的优化方案:多级时间轮。时间轮的使用场景调度模型,时间轮是为解决高效调度任务而产生的调度模型。例如,周期任务。数据结构,通常由hashtable和链表实现的数据结构。延时任务、周期性任务应用场景主要在延迟大规模的延时任务、周期性的定时任务等。通知任务等等。时间轮的实现方案
  为了充分发挥时间轮算法的效果和优势,我们要从基础上去分析和优化时间轮算法对比定时任务、任务队列模式的运作基底。减少线程分配
  时间轮是一种高效来利用线程资源来进行批量化调度的一种调度模型,把大批量的调度任务全部都绑定到同一个的调度器上面,使用这一个调度器(线程)来进行所有任务的管理(manager),触发(trigger)以及运行(runnable)。CPU的负载和资源浪费减少
  承接上面减少线程分配,最后可以使得当我们需要进行大量的调度任务或者延时任务,可以大大减少线程的分配,如果按照任务调度模式,每个任务都使用自己的调度器来管理任务的生命周期的话,可能会进行分配很多线程,从而会消耗CPU的资源并且很低效。
  注意:问题就是如果这个调度器的调度线程出现了问题,会导致整体全局崩溃。延时任务或定时任务实现原理
  如何实现定时任务延时任务,定时的任务调度分两种:延时任务:一段时间后执行,即:相对时间。定时任务:指定某个确定的时间执行,即:绝对时间。
  对于延时任务和定时任务两者之间是可以相互转换的,例如当前时间是12点,定时在5分钟之后执行,其实绝对时间就是:12:05,定时在12:05执行,相对时间就是5分钟之后执行。时间轮功能设计
  时间轮实现定时延时任务队列,最终需要向上层提供如下接口:添加定时延时任务删除定时延时任务执行定时延时任务时间轮的数据结构时间轮(HashedWheelTimer)是存储定时任务的环形队列,底层采用数组实现,数组中的每个元素可以存放个定时任务列表(HashedWheelBucket)。HashedWheelBucket是环形的双向链表,链表中的每一项表示的都是定时任务项(HashedWheelTimeout),其中封装了真正的定时任务(TimerTask)。单时间轮基本逻辑模型
  时间轮算法是:不再任务队列作为数据结构,轮询线程不再负责遍历所有任务,而是仅仅遍历时间刻度。时间轮算法好比指针不断在时钟上旋转、遍历,如果一个发现某一时刻上有任务(任务队列),那么就会将任务队列上的所有任务都执行一遍。
  时间轮由多个时间格组成,每个时间格代表当前时间轮的基本时间跨度(tickDuration),时间轮的时间格个数是固定的。
  如上图中相邻bucket到期时间的间隔为bucket1s,从0s开始计时,1s时到期的定时任务挂在bucket1下,2s时到期的定时任务挂在bucket2下,当检查到时间过去了1s时,bucket1下所有节点执行超时动作,当时间到了2s时,bucket2下所有节点执行超时动作等等。
  如上图的时间轮通过数组实现,可以很方便地通过下标定位到定时任务链路,因此,添加、删除、执行定时任务的时间复杂度为O(1)。时间轮数据结构模型pointer:指针,随着时间的推移,指针不停地向前移动。bucket:时间轮由bucket组成,如上图,有12个bucket。每个bucket都挂载了未来要到期的节点(即:定时任务延时任务)。slot:指相邻两个bucket的时间间隔。tickDuration:slot的单位,1s(1HZ),如上图,总共12个bucket,那么两个相邻的bucket的时间间隔就是一秒。
  时间轮使用一个表盘指针(pointer),用来表示时间轮当前指针跳动的次数,可以用tickDuration(pointer1)来表示下一次到期的任务,需要处理此时间格所对应的TimeWheel中的所有任务。时间轮处理逻辑计算延时时间存储
  时间轮在启动的时候会记录一下当前启动的时间赋值给startTime。时间轮在添加任务的时候首先会计算延迟时间(delayTime),比如一个任务的延迟时间为24ms,那么会将当前的时间(currentTime)24ms时间轮启动时的时间(startTime)。然后将任务封装成TimeWheelElement加入到bucket队列中。TimeWheelElement的总共延迟的次数:将每个任务的延迟时间(delayTime)tickDuration计算出pointer需要总共跳动的次数以及计算出该任务需要放置到时间轮(wheel)的槽位,然后加入到槽位链表最后将任务放置到时间轮wheel中。读取延时数据任务队列
  时间轮在运行的时候会将bucket队列中存放的TimeWheelElement任务取出来进行遍历,从而进行执行对应的任务体系机制。计算出当前时针走到的槽位的位置,并取出槽位中的链表数据,防止万一,还可以再delayTime和当前的时间做对比,运行过期的数据。单时间轮的问题和弊端显而易见,时间轮算法解决了遍历效率低的问题。(现在,即使有10k个任务,轮询线程也不必每轮遍历10k个任务,而仅仅需要遍历24个时间刻度)。时间轮算法中,轮询线程遍历到某一个时间刻度后,总是执行对应刻度上任务队列中的所有任务(通常是将任务扔给异步线程池来处理),而不再需要遍历检查所有任务的时间戳是否达到要求。内存和资源的消耗巨大
  但这种单时间轮是存在限制的,只能设置定时任务到期时间在12s内的,这显然是无法满足实际的业务需求的。当然也可以通过扩充bucket的范围来实现。例如,将bucket设置成232个,但是这样会带来巨大的内存消耗,显然需要优化改进。轮询线程仍然还会慢慢的出现遍历效率低问题
  当时间刻度增多,而任务数较少时,轮询线程的遍历效率会下降,例如,如果只有50个时间刻度上有任务,但却需要遍历1440个时间刻度。这违背了我们提出时间轮算法的初衷:解决遍历轮询线程遍历效率低的问题。浪费内存空间问题
  在时间刻度密集,任务数少的情况下,大部分时间刻度所占用的内存空间是没有任何意义的。如果要将时间精度设为秒,那么整个时间轮将需要86400个单位的时间刻度,此时时间轮算法的遍历线程将遇到更大的运行效率低的问题。轮数时间轮基本逻辑模型
  时间轮的时间刻度随着时间精度而增加并不是一个好的问题解决思路,所以计划将时间轮的精度设置为秒,时间刻度个数固定为60。每一个任务拥有一个round字段,基于单时间轮原理之下,我们在每个bucket块下不单单存储到期时间expire时间的任务,还会存储一个新字段round(expireNbucket的定时器(N为bucket个数))。主要由一下两个字段组成expire:代表到期时间round:表示时间轮要在转动几圈之后才执行任务执行bucket下的延时逻辑
  当指针转到某个bucket时,不能像简单的单时间轮那样直接执行bucket下所有的定时器,而是要去遍历该bucket下的链表,判断判断时间轮转动的次数是否等于节点中的round值,只有当expire和round都相同的情况下,才能执行该任务。
  轮询线程的执行逻辑是每隔一秒处理一个时间刻度上任务队列中的所有任务,任务的round字段减1,接着判断如果round字段的值变为0,那么将任务移出任务队列,交给异步线程池来执行对应任务。如果是重复执行任务,那么再将任务添加到任务队列中。
  轮数计算的公式
  轮询线程遍历一次时间轮需要60秒,如果一个任务需要间隔x秒执行一次,那么其round字段的值为x60(整除),任务位于第(x60)(取余)个刻度对应的任务队列中。
  例如,任务需要间隔130秒执行一次,那么round字段的值为2,此任务位于第10号时间刻度的任务队列中。
  时间轮round次数:根据计算的需要走的(总次数当前tick数量)时间格个数(wheel。length)。提取计算对应的bucket下的任务数据
  比如,tickDuration为1ms,时间格个数为20个,那么时间轮走一圈需要20ms,那么添加进一个延时为24ms的数据,如果当前的tick为0,那么计算出的轮数为1,指针没运行一圈就会将round取出来1,所以需要转动到第二轮之后才可以将轮数round减为0之后才会运行。轮数时间轮的问题和缺点
  改进版单时间轮是时间和空间折中的方案,不像单时间轮那样有O(1)的时间复杂度,也不会像单时间轮那样,为了满足需求产生大量的bucket。但是这种方式虽然简化了时间轮的刻度个数,但是并没有简化运行效率不高的问题。运行效率不高的问题
  改进版的时间轮如果某个bucket上挂载的定时器特别多,那么需要花费大量的时间去遍历这些节点,如果bucket下的链表每个节点的round都不相同,那么一次遍历下来可能只有极少数的定时器需要立刻执行的,因此很难在时间和空间上都达到理想效果。
  时间轮每次处理一个时间刻度,就需要处理其上任务队列的所有任务。其运行效率甚至与基于普通任务队列实现的定时任务框架没有区别。层级时间轮基本逻辑模型
  为了解决单时轮和轮数时间轮引起的性能问题和资源问题的另一种方式是在层次结构中使用多个定时轮,由多个层级来进行多次hash进行任务数据的传递,从而减少对应的时间和空间的复杂程度。多级时间轮
  【年、月、日、小时、分钟、秒】级别的6个时间轮,每个时间轮分别有(10年暂时定为10年)、12(月)、24(时)、60(分钟)、60(秒)个刻度。子轮转动一圈,父轮转动一格,从父向子前进,无子过期。分层时间轮如下图所示:
  案例流程执行体系
  任务需要在当天的17:30:20执行任务添加于秒级别时钟轮的第20号Bucket上,当其轮询线程访问到第20号Bucket时,就将此任务转移到分钟级别时钟轮的第30号Bucket上。当分钟级别的时钟轮线程访问到第30号Bucket,就将此任务转移到小时级别时钟轮的第7号Bucket上。当小时级别时钟轮线程访问到第7号bucket时。
  最终会将任务交给异步线程负责执行,然后将任务再次注册到秒级别的时间轮中。分层时钟轮算法设计具有如下的优点轮询线程效率变高:首先不再需要计算round值,其次任务队列中的任务一旦被遍历,就是需要被处理的(没有空轮询问题)。线程并发性好:虽然引入了并发线程,但是线程数仅仅和时钟轮的级数有关,并不随着任务数的增多而改变。如果任务按照分钟级别来定时执行,那么当分钟时间轮达到对应刻度时,就会将任务交给异步线程来处理,然后将任务再次注册到秒级别的时钟轮上。
  分层时间轮中的任务从一个时间轮转移到另一个时间轮,实现层级轮算法可以借鉴了生活中水表的度量方法,通过低刻度走得快的轮子带动高一级刻度轮子走动的方法,达到了仅使用较少刻度即可表示很大范围度量值的效果。

OPPOFindX5Pro手机潘塔纳尔公测招募IT之家3月15日消息,OPPOFindX5Pro手机潘塔纳尔xColorOS13第二波升级公测招募现在开启,招募时间为20233142023315,预计将在招募结束后5个工作……澳门居民,13项澳门社保服务可在横琴专窗办理啦这么快就好啦?太感谢你了!67岁的莫燕琼是定居珠海横琴的澳门居民,3月23日,她来到离家不到一公里的澳门青年创业谷粤澳社保一窗通(横琴专窗)办理澳门社保的在生证明业务。以前每年……iOS17新消息,将增加几个实用的新功能,开发者预览升级方式苹果目前已经向iPhone手机推送了iOS16。4RC准正式版升级更新,iOS16。4正式版也很快就会推送升级,而iOS17系统也有了新的消息。iOS16系统升级更新增加……泰山0元门票预约已满4月1日起恢复正常售票中国山东网感知山东3月29日讯(记者张敏敏)3月29日上午,泰安市政府新闻办召开新闻发布会,通报泰山景区免门票开放服务保障工作情况。泰山景区管委会发布《关于泰山门票预约已满的通……英雄池固然重要,绝活哥同样能打高分局,各分路英雄要选对如果你不准备打职业,英雄池对你而言并不重要。英雄池深代表玩家上限高,但并不代表玩家能打上顶端局,路人局巅峰排名靠前的玩家很多都是绝活哥。对于普通玩家而言,精通一个英雄上分比熟悉……Ventoy一款简单好用的U盘启动盘工具和朋友聊天说起现在的年轻人不知软驱为何物,在2000年前软驱是一台电脑的标配,在90年代5。5寸软驱和3。5寸软驱同时在PC上共存,安装系统需要好十几张磁盘,后来光驱价格降下来……(体育)篮球CBA常规赛广东东莞大益胜新疆伊力王酒当日,在20222023赛季中国男子篮球职业联赛(CBA)常规赛第42轮比赛中,广东东莞大益队主场以108比95战胜新疆伊力王酒队。4月5日,新疆伊力王酒队球员塔克法尔(……CBA首钢经历严重伤病潮缺席球员能凑出一个阵容16日晚,北京首钢队在最多领先福建队17分的情况下未能把握住机会,最终以88比103失利,本赛季到目前对排名倒数第二的福建队的战绩为1胜2负,而对手从开季到现在总共才赢了5场。……苍雾残响国际服内测上线如何下载?下载注册解决延迟教程来了《苍雾残响》是一款二次元机甲x巨人美少女战棋手机游戏,官方宣布将于2023年上半年正式推出。目前不少内测玩家已经对该游戏进行了评价,好评数量是非常多的。尤其是该游戏的特色二次元……量少,,没必要吃太多药,我来帮你去关爱女性健康月经量少内膜薄,没必要吃太多药,我来帮你去怀孕。你不需要每天跑到医院去测这个b超。监测卵泡,只需要把体温测了,我们就知道你有没有排卵促排卵的药。我要不要继续吃呢?因……米体名帅普兰德利宣布退休,曾率意大利夺得欧洲杯亚军直播吧3月14日讯据《米兰体育报》报道,65岁的意大利名帅普兰德利正式宣布退休。普兰德利过去曾在佛罗伦萨、罗马、亚特兰大、瓦伦西亚、加拉塔萨雷等多家欧洲知名俱乐部执教,并……世界杯半决赛阿根廷vs克罗地亚裁判安排意大利名哨奥尔萨托执法直播吧12月11日讯世界杯半决赛阿根廷vs克罗地亚裁判任命公布,意大利裁判组执法,名哨奥尔萨托担任主裁。【裁判组】主裁判:奥尔萨托(意大利)第一助理裁判:Ci……
独家中国移动集团市场部总经理张冬调任北京移动总经理运营商财经吴碧慧文继上个月底原北京移动总经理夏冰升任中国电信集团副总经理后,空缺的北京移动总经理一职目前已有接班人选,运营商财经网独家获悉,北京移动总经理由中国移动集团市……讲真,穿搭不同区别还是很大的,6张图告诉你重要性穿搭技巧真的有用吗?别的不说,就这些搭配,差别好大!还在把时尚感归结为身高、胖瘦和颜值的功劳吗?还在为自己的长相不好感到自卑吗?这次小喵就扫扫雷,和大家科普一下穿搭技巧的……杜兰特211,一度落后18分!锡安114欧文成铁匠,篮网新援北京时间10月20日篮网主场对阵鹈鹕,半场比赛结束篮网以5058落后于鹈鹕。休赛期鹈鹕没有做过多的补强,但是随着锡安的复出鹈鹕就备受瞩目,毕竟麦科勒姆、小南斯的到来就已经让鹈鹕……自然拼读干货图解总结6大核心热搜问题No。1:自然拼读的概念?自然拼读法(Phonics)简单来说,是学习字母及字母组合的发音规律,即字母字母组合在什么情况下应该发什么音。比如当孩子知道字母组合sh发,字母……4个月开始旅行,见识远超同龄人,北大爸爸的另类育儿经值得借鉴认识一位北大毕业的学霸爸爸,他特别看重旅行对孩子成长的重要性,从他家儿子4个月开始带出去旅行,至今还在6岁,已经去过20多个城市。他说:从一开始的走马观花,到现在旅行通识……12月21号研究人员刚刚发现了一个保存完好的恐龙胚胎研究人员在一个化石蛋中发现了一个保存完好的恐龙胚胎。被称为婴儿英亮的胚胎是一种名为偷蛋龙的无牙兽脚亚目动物。兽脚亚目动物以其像鸟一样的脚而闻名。科学家们认为,现代鸟类是一群较小……联发科智能物联网AIoT平台大发力,Genio1200旗舰芯能与用户唠嗑的智能音箱、可远程操控的智能家电、自动化的智能垃圾桶海量的智能物联网产品出现于大众生活之中,带来越来越高的便利度和效率。在这一些背后,芯片厂商正在通过持续不断的技术……iphone14pro创新型公司的觉悟?小编作为一个果粉,不仅对一年一度的科技春晚非常关注,同时对于苹果公司的创新精神一直都非常认同,甚至愿意去为一些新奇的东西买单,但是这次的灵动岛却让我看到了与创新精神不符合的妥协……哪家量子软件开发公司值得关注?ZapataComputing哪家量子软件开发公司值得关注?ZapataComputing。KellyOnTech量子计算系列这期介绍一家全球领先的量子软件开发公司ZapataComputing,20……冬奥会期间,外籍涉奥人员来华将正式启动小闭环管理距离北京2022年冬奥会开幕进入倒计时还有不到1个月的时间,国内的防疫工作也是紧锣密鼓地准备着根据冬奥组委要求,结合场馆工作实际情况,场馆运行团队针对提前抵达场馆开展工作……S26赛季第一天,冷门装和献祭流雅典娜火了,芈月白晶晶优化王者荣耀S26赛季开启第一天,玉城之子版本与以往大版本更新一样出现多个异常BUG问题,比如iOS15。0beta测试版系统出现的闪退问需要玩家更新手机系统解决,而铭文编辑、暃在……华为对燃油车倒计时的判断不够严谨华为消费者业务CEO余承东说道:纯燃油车时代会迅速结束,现在还买燃油车,就像智能手机时代买功能机。我认为现在对燃油车下结论还为时过早,毕竟新能源汽车到目前为止,市场占有率……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网