想如何打开今日头条制造,怎么总是"正在下载更新"

阿里妹导读:网上购物的普及化帶动了物流行业的迅猛发展同时也带来了极大的压力和严峻的考验,特别是在电商大促的时节如何有效提高整个物流链路的时效体验,给消费者更好的体验这是菜鸟物流一直奋斗的目标。

今天我们来深入了解菜鸟的轻量级定时任务调度引擎设计系统,学习如何在亿級别包裹中快速定位运输超时的包裹

在中国物流快速发展的今天,日均包裹量已经突破1亿如何确保1亿包裹在合理的时间之内送达收件囚,并且能够在收件人反馈之前及时处理那些没有在合理时间内运输的包裹,从而提高物流整个链路的时效体验已经成为亟待解决的關键问题。    

要想解决问题首先要发现问题!有效、及时地发现问题离不开对这1亿包裹运输过程中每个环节实时监控,而要实现这个场景就需要一个能够支撑起如此量级的实时定时调度系统。这就是本文的主题:轻量级定时任务调度引擎的设计

针对上文提到的问题场景,一般的做法是将定时任务写入数据库通过一个线程定时查询出将要到期的任务,再执行任务相关逻辑该方案的优点是实现简单,尤其适合单机或者业务量比较小的场景来但是缺点也很明显:在分布式且业务量较大的场景中会引入很多复杂性。首先需要设计一套合悝的分库分表逻辑,以及集群任务负载逻辑其次,即使做到这些也会由于某些场景定时任务时间集中在某个时间点,导致集群单节点壓力过大再次,需要合理的预估容量否则后续线性存储扩容将会非常复杂。

我们发现上述方案的主要问题其实是定时任务时间和任務存储的耦合。如果能够将时间和存储解耦任务的存储就等于是无状态的,这样对存储的可选择性范围会大很多对存储的约束也大大降低!

下文将会介绍如何通过时间轮思想将定时任务的时间和任务本身进行解耦,从而在设计和性能上得到很大的提升

时间轮方案将现實生活中的时钟概念引入到软件设计中,主要思路是定义一个时钟周期(比如时钟的12小时)和步长(比如时钟的一秒走一次)当指针每赱一步的时候,会获取当前时钟刻度上挂载的任务并执行整体结构如图1。

从上图可以看到对于时间的计算是交给一个类似时钟的组件來做,而任务是通过一个指针或者引用去关联某个刻度上到期的定时任务这样就能够将定时任务的存储和时间进行解耦,时钟组件难度鈈大以何种方式存储这些任务数据,是时间轮方案的关键

我们发现,阿里巴巴MQ(RocketMQ商业化版本后文统称为阿里巴巴MQ)对其定时消息的妀造[1]很有借鉴意义,老方案基于定时轮询的方式check消息是否到期这种方案对于离散的时间比较受限,所以也就导致老版本只能支持几种延遲级别的定时消息为了解决这个问题,阿里巴巴MQ团队将原方案改造为基于时间轮+链表的方案从而既能支持离散的定时消息,也能够解決传统时间轮每个刻度需要管理各自任务列表的复杂性

图2 阿里巴巴MQ定时消息方案

图2简明的描述了方案的关键点,其设计思路就是将任务列表写入到磁盘并且在磁盘中采用链表的方式将任务列表串起来,要达到这种串起来的效果需要每个任务中都有一个指向下一个任务嘚磁盘offset,只需要拿到链表的头便可以获取整个任务链表于是在该方案中,时间轮的时间刻度不需要存储所有的任务列表只需要存储链表的头即可,从而将内存的压力释放出来

该方案对于中间件这样定位的系统来说是可以接受的,但对于一个定位在普通应用的系统来说对部署的要求就显得过高了,因为你需要一块固定的硬盘在当前容器化以及容量动态管理的趋势下,一个普通应用需要依赖一块固定嘚磁盘对系统的运维和部署都会带来额外的复杂度。于是在此基础上形成本文重点介绍的轻量级定时任务调度引擎

轻量级定时任务调喥引擎

轻量级定时任务调度引擎借鉴了时间轮方案的核心思想,同时去除了系统对磁盘的依赖既然不能将数据直接存储在磁盘,那只能依托专门的存储服务(比如HbaseRedis等)来进行存储。于是就将下层的存储替换成了一种存储服务能够满足的结构:

图3 调整后的时间轮+链表方案

將任务设计成一种结构化的表并且将上面的offset替换成了一个任务ID(图2是文件的offset),并且通过ID将整个任务链表串起来时间轮上只关联链表頭的ID。这里对MQ方案改造的点只是将磁盘的offset替换成一个ID从而解耦对磁盘的依赖。

方案到现在感觉可以行得通但是又引出了另外两个问题:

问题1:单一链表无法并行提取,从而影响提取效率对于某个时刻有大量定时任务的时候,定时任务处理的延迟会比较严重;

问题2:既嘫任务不是存储在本机磁盘了表明整个集群的定时任务是集中存储,而集群中各个节点都拥有自己的时间轮那么集群里面每个节点重啟之后如何恢复?集群扩容&缩容如何自动管理

任务链表分区——加速单一链表提取

链表的好处是在内存中不用存储整个任务列表,而只需要存储一个简单的ID这样减少了内存的消耗,但是却带来了另一个问题众所周知,链表的特性是对写友好但读的效率却并不高,如果某个时刻需要挂载很长的任务链表那链表的方式是完全不能利用并发来提高读的效率。

如何能够提高某个时间的任务队列提取的效率呢这里利用分区的原理,将某个时刻的单一链表通过分区的方式拆分成多个链表当将某个时间点的任务提取的时候,可以根据链表集匼大小来并行处理从而可以加速整个任务提取的速度。所以方案调整成图4:

图4 分区后的设计方案

集群管理——集群节点的自我识别

解决叻定时任务的存储问题和单一链表提取任务的效率问题好像整个方案都已经ready了,但是还有另一个重要的问题前面没有考虑进去就是集群部署后节点重启后如何进行恢复?比如需要知道重启之前的时间轮刻度需要知道重启之间时间轮刻度上的定时任务链表数据等,后面峩统一将这种数据称之为时间轮元数据如果任务写入磁盘,某个机器的重启可以从本地磁盘加载当前节点的时间轮元数据来进行恢复;而如果不是通过磁盘来实现,那就带来问题2-1:一台机器在重启之后怎么获取它重启之前的时间轮元数据呢

通过上面的解决定时任务存儲问题,对于元数据的存储也可以借助专门的存储服务但是由于集群的各个节点是无状态的,所以各个节点启动的时候并不知道如何從存储服务中读取属于自己的元数据(也就是查询的条件),这便引出了问题2-2:集群节点怎么获取属于它的元数据呢 

可能第一想到的就昰将元数据和节点ip或者mac地址关联上,但是在现在动态容量调度的情况下一个机器拥有一个固定的ip也是很奢侈的,因为你不能保证你的应鼡会运行在哪台机器上既然物理环境不能依赖,就只能依赖逻辑环境来对每个节点的时间轮进行区分了于是就通过对集群每个节点分配一个在集群中唯一的逻辑ID,每台机器通过自己拿到的ID去获取时间轮数据于是又引出了问题2-3:这个ID由谁来分配? 这就是Master节点

在整个集群中需要选举出一个节点为Master,所有的其他节点会将自己注册到Master节点中然后再由Master节点分配一个ID给各个节点,从而通过这个ID到存储服务中获取之前时间轮的元数据信息最后初始化时间轮。图5和图6是该过程的描述图:

图5 集群启动注册以及分配ID过程

图6 单个节点启动过程

图5展示了節点注册和获取ID的过程注意, Master节点自身也注册并且分配了ID这是因为对一个普通应用来说,并没有Master和非Master之分Master也是会参与整个业务的计算的,只不过它除了参与业务计算之外额外还要进行集群的管理。

集群自动化管理——自动感知扩容&缩容

上文引出了Master节点并且所有节點都会将自己注册给Master(包括Master自己),于是基于Master就可以构建出一套集群管理的机制对于普通应用来说,集群的扩容缩容是很正常的操作在动態调度的场景下,扩缩容操作甚至连应用owner都不感知那么集群能够感知自己被扩容了和缩容了么?答案是肯定的因为存在一个Master节点,而Master鈳以感知到集群的其他节点的存活状态Master发现集群的容量变化,从而做出集群的负载调整

定时任务提取集群化——集群压力软负载

上文通过将时间轮上的某个时间关联单一链表拆分成多个链表来提高提取任务的并发度,同时也已构建出了一套集群管理方案如果这个并发喥只是在单节点,只让该节点自己提取将会因为某个时刻的当前节点到期的任务数量很大,从而导致集群中某些节点的压力会很大为叻能够更加合理的利用集群计算能力,那么可以基于上面的集群管理能力对方案再进一步优化:将提取的到期任务链表集合通过软负载嘚方式分发给集群其他节点,同时由于任务的数据是集中存储的只要其他节点能够拿到任务链表头的ID,便可以提取得到该链表的所有任務从而集群的压力也将被平摊,图7是该过程的交互过程:

图7 集群并行提取任务

上面对整个方案的演进以及各个阶段遇到的问题进行了詳细的介绍,可能还有一些点没有太深入大家可以回复留言中详细讨论。下面结合上面的内容做了一个简单的流程梳理,以方便大家對全文的理解

[1] 消息的处理方法、装置和电子设备:中国,.7[P]..

张国强引领"怂富帅好男人"

网易4月4ㄖ报道“你瞅啥呀没见过美男子啊?”张国强微信的这句签名透着幽默和傲骄,一如当年《士兵突击》中的七连长可十年后,那个帥气傲骄的男人怎么就突变为《麻辣芳邻》里有点怂的邋遢大叔了《麻辣芳邻》正在央视热播,张国强以凉鞋配着灰丝袜的造型引领“慫富帅新好男人”形象网友都对“张国强竟然怂成这样”表示咂舌,称他有“自黑”精神而张国强接受记者采访时说:“我这不叫自嫼,是敢于破坏自己……”

《麻辣芳邻》央视热播张国强凉鞋配着灰丝袜引领“都市别墅新时尚”

随着《麻辣芳邻》在央视热播张国强叒一角色——老杨深入民心。若遇到偷懒的导演那么《麻辣芳邻》里老杨一角就该找“脑袋大,脖子粗”的火夫型男来演但偏偏他们選中向来以“军旅偶像”示人的张国强,于是就有了现在这种出人意料的、冲突感极强的喜剧效果进城务工的农民老杨,因帮人“捉奸”意外结识“麻辣芳邻”一场时尚与土气、麻辣与憨厚的浪漫对撞就此展开。

电视剧热播后“张国强牛莉为戏自黑”的报道铺天盖地,网友对张国强颠覆“军旅偶像”变身有点怂的邋遢大叔也表示“太意外”。对此张国强接受采访时回应:“我这不叫自黑吧,我这昰角色塑造叫敢于破坏自己吧,敢于打碎……”就老杨的造型而言观众已然深切品味到这次张国强是何等“敢于破坏自己”,正因张國强做了很多独特设计才有了这版喜剧色彩四溢的老杨。挎在腰带上的磨损手机套黑色绷带凉鞋配着灰丝袜,老款鸭舌帽印着带电话號码的“老杨电器”广告……这些都是张国强设计的“自我破坏”与“角色塑造”形体与造型的变化还只是表象,很多观众都听出来这佽张国强连声音语调都变了《麻辣芳邻》热播后,很多人问他“你这是哪儿的口音啊,听不出来节奏那么慢。”张国强解释说:“其实不是哪里的口音就是表演处理。如果一定说有借鉴可能借鉴了《渴望》里的李雪健老师吧”。

在日益浮躁忙着串戏的演艺界,能沉下心来设计角色甚至连声音都全情参演的演员,并不多见正因如此注重细节,张国强每部作品都能给观众留下一个刻入脑海的角銫《推拿》里张国强演的盲人,举手投足间都给观众强烈的带入感诚如他自述,“那一次连脖子都参与了表演”在《无贼》里,张國强把小偷演得也鲜活无比以至一些社会边缘群体见到张国强,很郑重很诚恳地和他讲“国强,你演的真好真有生活,你是不是练過”对此,张国强内心虽窃喜语言上只能无奈回应,“我真没有这方面的生活……”

戏里甘为“怂富帅新好男人”戏外张国强自称“哆少有点大男子主义”

《麻辣芳邻》里张国强饰演的新农村企业家老杨,全新表现了新农民形象他和牛莉非常生活化的对手戏时常给觀众以深刻触动,比如剧中一段对白完全颠覆之前社会广为流传的另一有关“宝马车”的爱情段子

芳邻:“刘焱让我告诉你,让你给我買辆车”

老杨:“你看看,你看看我就知道你们城里人,财迷”

芳邻(边说边拍打着老杨):“谁财迷啊,你说谁呢你说谁呢,討厌~”

老杨(边躲边笑,突然间抱住芳邻很诚恳地说):“给你买辆宝马”。

芳邻深情傲娇地说:“我无动于衷”

老杨一时愣住,然后故作泄气状:“哎呀~那就算了吧本来我还想拉拉窗帘呢”。

芳邻抱住老杨脱口而出:“车我不要了,你还是拉窗帘吧”

这場戏让张国强和牛莉处理得干净浪漫,纯美感动很多女性观众表示,看过张国强的演绎从此不再喜欢高富帅的傲娇,就喜欢老杨这一款“怂富帅”的温暖采访中,试探性问张国强老杨能接受女强男弱的关系,可生活中的你是倾向男强女弱吧张国强乐了,反问道:“你就准备把这个(定义)加给我了呗”之后他很诚恳地承认:“我~会吧,会有这样的念头有的时候是(倾向男强女弱),可能和東北人有关系多少有点大男子主义,我其实是希望能挑起所有的担子不让女人那么辛苦。最好全家人的担子我都能挑起来我觉得男囚就应该有这种承担”。

《士兵突击》十年后张国强“恩师康红雷让我学会把傲气藏在心里”

张国强最近签约北京华盛金榜国际传媒有限公司董事长高库私下里对张国强的评价极高,常说“国强人品特别优秀是有担当的男人和合作伙伴”。公司特想在生活上给予更多照顧但张国强从不要求助理,偶尔到外地出行常常自己打车,不想麻烦别人接送这个量级的明星,还能保持这种接地气的生活或许吔解释了为什么张国强能把每一个小人物鲜活地呈现给观众。

问张国强是不是为表演而刻意保持这种生活状态,他凝思一下说:“不是吧很多年前,我曾确实刻意地自我规范现在已经是自然而然了。刚演完《士兵突击》那会儿有自己的粉丝了就会有点得意,觉得哎喲我有影迷了还没有太膨胀,没有完全翘尾巴就是感觉有点小成功了。我的恩师康红雷就和我说‘你是一个很牛的演员,但你要学會把那种傲气藏在心里然后用一个个鲜活的角色征服观众,学会把得意藏在幕后那才是最牛的,懂吗’我的恩师决定了我完全都放丅的状态,直到现在”

《士兵突击》十年后,听张国强鲜活再现康红雷当年“教导”仍能感知他称导演康红雷为“恩师”的那份情意。十年后“士兵兄弟”在影视、综艺、导演等领域上走了不同的路,有着各自不同的精彩而“七连长”的光彩之中,仍有一种精神触動着你

采访结束时,又看了一眼他微信头像——“超人强”卡通张国强一身超人的装扮,配着猫王最经典的发型瞬间发现,原来这個男人真的有好多面诚如他所说:“作为一个职业演员,就想着不断地挑战、塑造和颠覆军人、盲人、小偷、农民等等,我都想尝试若塑造成功了,那种愉快特别舒服……”

我要回帖

更多关于 如何打开今日头条 的文章

 

随机推荐