阿里妹导读:网上购物的普及化带动了物流行业的迅猛发展,同时也带来了极大的压力和严峻的考验,特别是在电商大促的时节。如何有效提高整个物流链路的时效体验,给消费者更好的体验,这是菜鸟物流一直奋斗的目标。
今天,我们来深入了解菜鸟的轻量级定时任务调度引擎设计系统,学习如何在亿级别包裹中快速定位运输超时的包裹。
在中国物流快速发展的今天,日均包裹量已经突破1亿,如何确保1亿包裹在合理的时间之内送达收件人,并且能够在收件人反馈之前,及时处理那些没有在合理时间内运输的包裹,从而提高物流整个链路的时效体验,已经成为亟待解决的关键问题。
要想解决问题,首先要发现问题!有效、及时地发现问题离不开对这1亿包裹运输过程中每个环节实时监控,而要实现这个场景,就需要一个能够支撑起如此量级的实时定时调度系统。这就是本文的主题:轻量级定时任务调度引擎的设计。
传统方案
针对上文提到的问题场景,一般的做法是将定时任务写入数据库,通过一个线程定时查询出将要到期的任务,再执行任务相关逻辑。该方案的优点是实现简单,尤其适合单机或者业务量比较小的场景来。但是缺点也很明显:在分布式且业务量较大的场景中会引入很多复杂性。首先,需要设计一套合理的分库分表逻辑,以及集群任务负载逻辑。其次,即使做到这些,也会由于某些场景定时任务时间集中在某个时间点,导致集群单节点压力过大。再次,需要合理的预估容量,否则后续线性存储扩容将会非常复杂。
我们发现,上述方案的主要问题其实是定时任务时间和任务存储的耦合。如果能够将时间和存储解耦,任务的存储就等于是无状态的,这样对存储的可选择性范围会大很多,对存储的约束也大大降低!
下文将会介绍如何通过时间轮思想将定时任务的时间和任务本身进行解耦,从而在设计和性能上得到很大的提升。
时间轮基本介绍
时间轮方案将现实生活中的时钟概念引入到软件设计中,主要思路是定义一个时钟周期(比如时钟的12小时)和步长(比如时钟的一秒走一次),当指针每走一步的时候,会获取当前时钟刻度上挂载的任务并执行,整体结构如图1。
图1 时间轮算法