专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

非常详细通过时间轮(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值,其次任务队列中的任务一旦被遍历,就是需要被处理的(没有空轮询问题)。线程并发性好:虽然引入了并发线程,但是线程数仅仅和时钟轮的级数有关,并不随着任务数的增多而改变。如果任务按照分钟级别来定时执行,那么当分钟时间轮达到对应刻度时,就会将任务交给异步线程来处理,然后将任务再次注册到秒级别的时钟轮上。
  分层时间轮中的任务从一个时间轮转移到另一个时间轮,实现层级轮算法可以借鉴了生活中水表的度量方法,通过低刻度走得快的轮子带动高一级刻度轮子走动的方法,达到了仅使用较少刻度即可表示很大范围度量值的效果。

春天最好的蔬菜,常吃体无忧,推荐10款经典做法,每款都味美鲜香新年美食市集大家好,欢迎大家来到我的美食自媒体,我是美食领域创作者锦绣V山东专注美食,让生活更有味。今天为大家带来了几道家常美食的做法,这几道美食也是深受大家的喜欢,而且是很常见的被称为20元人民币老爷爷的漓江渔翁离世来源广西新闻频道据阳朔县漓江景区官方抖音号2月18日消息黄全德老爷爷于今天凌晨4点长眠,享年94岁。在漓江边,有一位老渔翁因为孤舟蓑笠翁而成名,他的形象像极了20元人民币背景图上的走马锦城青羊宫那一年开春陆游骑马慢走于成都西边青羊宫被梅花美景吸引写下梅花绝句当年走马锦城西,曾为梅花醉似泥二十里中香不断,青羊宫到浣花溪青羊宫位于成都西西环路边地铁5号线可达,门票10元青羊宫桃源的春天始于红色,九溪梅花可以作证桃未芳菲杏未红,冲寒先喜笑东风。魂飞庾岭春难辨,霞隔罗浮梦未通。绿萼添妆融宝炬,缟仙扶醉跨残虹。看来岂是寻常色,浓淡由他冰雪中。自从2021年桃源县九溪镇双龙村的梅花走红之后,每年沿钱塘江行,重游盐官古镇,在寂寞中看繁华今日上午在钱塘江边游荡,江景一般,只有那只搁浅在江滩上的渔船让人印象深刻。那只搁浅的渔船在等潮水,我在等什么?不用问,我什么也没等,想起一句老话,船到桥头自然直,我不再因无所事事而寻找中国的千里江山图近日,一游客在葛仙山透过石栏拍摄远处山景,栅栏恰似相框,框出一副千里江山图,引来无数网友感叹古人诚不我欺原本以为千里江山图是写意,其实是写实的。图源抖音夏泊轩截图为何会有这样的感慨2分钟,带你领略河源桃花源的浪漫今日,伴随着满园动人的客家山歌,河源上坪桃花源桃花摇曳生姿,绽放出迷人的姿态。曾经采菊东篱下的晋代诗人陶渊明写下桃花源记,留下的千古文字,给世人留下千年遐想。桃花源记中给世人描绘了为何去产区反而买不到真沉香?明明白白告诉你,这叫灯下黑文香至尊孙玉辉所信者目也,而目犹不可信所恃者心也,而心犹不足恃孔子。年前疫情政策放开,再加上东南亚地区对华人游客都非常热情,离得也近,很多朋友出国旅游都会选择泰国越南马来印尼等国家好逛的广东南海大地艺术节,日本乡村复兴范本的中国实践假日里,乘轮渡登上江心岛,在幽静的村庄里探访精心改造的老建筑,欣赏艺术作品的同时,与本地志愿者聊聊艺术与生活,再去艺术家装修的餐厅品尝新鲜食材烹制的特色菜肴。惬意的乡村艺术之旅,将凤凰古城里遗落的时光文章写于2018年当翠翠的爱情悄然闯入我的梦里时,静默而神秘的古城已经等待了我无数个日夜。年幼时曾拜读过沈从文先生的巨著边城,书中诗画般的风境,啼声婉转的黄莺繁密的虫声美丽的黄昏如胡锡进的济宁之行,钟爱山水,崇尚孔孟文化胡锡进来头很大,前环球时报总编辑,现资深媒体人。如今爆火全球的CHATGPT也对老胡进行了总结,胡锡进说CHATGPT的嘴上就像抹了蜜。在昔年的钟声渐行渐远之时,老胡突然来到了鲁西
美股一线美联储加息预期降温,美股三大股指全线飙升,市场再迎通胀数据考验21世纪经济报道记者吴斌上海报道随着经济数据显示通胀担忧趋缓,美联储加息预期也有所降温,上周五美股三大股指全线大涨,标普500指数纳指涨逾3,道指涨逾2。从一周表现来看,纳指表现最评论11拼音招牌就是瞎折腾城市的美化和文明,在于生活在城市里每一个人是否感受到被尊重6月24日,四川成都网友爆料,包括她家商铺在内的一排商铺招牌被换成了拼音版,对生意产生一定影响。26日,事发地一名商户告诉骑自己的自行车,让别人去说吧翻开我的生活日记这些骑车运动常识,你应该了解。一,山马党一样光荣。骑什么车子,走什么路,完全由自己决定。山地车骑在城市的大街小巷上,一样健身运动,就是一天也没有上山林越野,也不丢人G7要砸6千亿对付中国项目!七国内部分歧不断,德国主张接近中国据环球网6月27日报道,26日,七国集团(G7)峰会在德国埃尔茂宫开幕。七国在峰会上讨论俄乌冲突能源危机等多个议题。其中,中俄成了讨论重点。G7决定众筹6千亿美元,打造一个名为全球2019年,中国留学生魏巍在日本被执死刑,执行前夕留下一个字悔2019年12月26日,被羁押于日本福冈看守所16年之久的魏巍,终于被执行死刑,作为客死他乡的异国旅人,国人对于他的死非但没有同情,反而指责日本司法不严谨,要是在中国,他早就长成勉2大权威官媒点名全红婵失误!一个动作让她4次输陈芋汐,心魔到来北京时间6月27日,布达佩斯世锦赛跳水项目的巅峰对决已经产生了决赛名单,中国的陈芋汐和全红婵碾压一般排在前两位。进了决赛之后,陈芋汐的总分是427。0分,全红婵的总分是413。70泰国民调前总理他信小女儿成总理第一人选巴育支持率持续下滑泰国将在一年内举行全国大选,最新民调显示前总理他信的小女儿佩通坦(PaetongtarnShinawatra)是选民心中的总理第一人选,现任总理巴育支持率持续下滑。泰国国立发展管理京东总裁被算计?刘强东案反转,女方求巨额赔偿漏洞百出,真能编刘强东案想必大家都有所耳闻,他本人也因为此案跌下神坛,深陷泥沼,甚至被警方逮捕,名声可谓一落千丈。要知道刘强东的媳妇是集美貌与才华于一身的奶茶妹妹章泽天,事件一出大家纷纷表示惊讶,20年,江西母亲割肝救子,意外发现儿子不是亲生,抱错还是被偷换2020年2月17日,江西九江的一位年轻小伙身体经常疼痛难忍,去医院检查后却得到了一个令人绝望的诊断结果肝癌。母亲在得知通过肝脏移植手术能保住儿子性命后,毅然决定割肝救子。然而经过汉中市龙岗学校2022年高考再攀新高汉中市龙岗学校2022年高考再攀新高,取得骄人成绩,赢得社会一片好评!一。彭莘尧,理科考生701分,居全市第1名,全省第8位理科考生杨雨晴696分,全省第19名理科考生苏丹694分市监总局征求意见禁止滥用知识产权排除限制竞争行为市场监管总局关于公开征求禁止滥用知识产权排除限制竞争行为规定(征求意见稿)意见的通知为贯彻落实修改后的反垄断法,市场监管总局研究起草了禁止滥用知识产权排除限制竞争行为规定(征求意见
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网