一、时间轮算法简介
为了大家能够理解下文中的代码,我们先来简单了解一下netty时间轮算法的核心原理
时间轮算法名副其实,时间轮就是一个环形的数据结构,类似于表盘,将时间轮分成多个bucket(比如:0-8)。假设每个时间轮轮片的分隔时间段tickDuration=1s(即:指针经过每个格子花费时间是 1 s),当前的时间bucket=3,那么在18秒后需要被执行的任务需要落到((3+18)%8=5取余运算)的5号bucket上。假如有多个需要在该时间段内执行的任务,就会组成一个双向链表。
另外针对时间轮我们要有下面的几个认知:
- 时间轮指针是一个Worker线程,在时间轮整点的时候执行双向链表中的任务。
- 时间轮算法的并不是精准的延时,它的执行精度取决于每个时间轮轮片的分隔时间段tickDuration
- Worker线程是单线程,一个bucket、一个bucket的顺序处理任务。 所以我们的延时任务一定要做成异步任务,否则会影响时间轮后续任务的执行时间。
二、时间轮hello-world
实现一个延时任务的例子,需求仍然十分的简单:你买了一张火车票,必须在30分钟之内付款,否则该订单被自动取消。 订单30分钟不付款自动取消,这个任务就是一个延时任务。 我们的火车票订单取消任务,从需求上看并不需要非常精准的延时,所以是