合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
[TOC] >[参考](https://chai2010.cn/advanced-go-programming-book/ch6-cloud/ch6-03-delay-job.html) ## 概述 如果业务规模比较小,有时我们也可以通过数据库配合轮询来对这种任务进行简单处理,但上了规模的公司,自然会寻找更为普适的解决方案来解决这一类问题。 一般有两种思路来解决这个问题: 1. 实现一套类似crontab的分布式定时任务管理系统。 2. 实现一个支持定时发送消息的消息队列。 ## 定时器的实现 定时器(timer)的实现在工业界已经是有解的问题了。常见的就是时间堆和时间轮。 ### 时间堆 ![](https://img.kancloud.cn/15/bc/15bc294e882c751a551d040c2269a34e_558x456.png) - 小顶堆的好处是什么呢?对于定时器来说,如果堆顶元素比当前的时间还要大,那么说明堆内所有元素都比当前时间大。进而说明这个时刻我们还没有必要对时间堆进行任何处理。定时检查的时间复杂度是`O(1)` - 当我们发现堆顶的元素小于当前时间时,那么说明可能已经有一批事件已经开始过期了,这时进行正常的弹出和堆调整操作就好。每一次堆调整的时间复杂度都是`O(LgN)` ### 时间轮 ![](https://img.kancloud.cn/19/2f/192f7e20f37de49e6ece7ad80212c2c5_791x492.png) 用时间轮来实现定时器时,我们需要定义每一个格子的“刻度”,可以将时间轮想像成一个时钟,中心有秒针顺时针转动。每次转动到一个刻度时,我们就需要去查看该刻度挂载的任务列表是否有已经到期的任务。