菜鸟笔记
提升您的技术认知

TimingWheel定时轮详解

说到定时轮,大家可能首先会想到时间轮,毕竟在Kafka中大量的延迟操作都是通过时间轮来处理。今天我来谈谈定时轮,一个比时间轮更简单的组件。

举个例子,在一个聊天系统中,用户的"离开"这个状态该如何处理?在一个服务端/客户端应用中,如果客户端长时间不和服务端交互,这个连接该如何释放?这些场景都可以通过定时轮解决。

对定时轮来说,有如下规约

(1)所有对象等待执行的时间都一样(可能会有细微差别,但不会太大)。

(2)新添加的对象只能保存在当前指针的上一个位置。上图中指针指向1号卡槽,假如此时加入一个新的对象,那么新的对象只能插在0号卡槽中(指针顺时针转动)。其实这条规约就保证了(1),所有的对象刚好等待一圈后执行

(3)相同的对象只能位于一个卡槽中,不能存在重复对象。

以聊天系统用户"离开"状态举例说明:假如用户A在10分钟内没有交流就认为用户A离开。构造一个定时轮,每个卡槽的持续时间是1秒,总共600个卡槽,这样指针转一圈刚好10分钟。只要用户A在交流,每次交流都会往定时轮添加对象,值就是用户的ID。这样用户A旧的值会清掉,新的值会添加进来(依据第3条规约),只要用户A在10分钟内有交流,就会一直这么循环下去。假如用户A在10分钟内没有交流,那么过了10分钟,指针会指向用户A的对象,这个对象会被清掉并执行回调函数。

Maven坐标

构造方法

TimingWheel(int tickDuration, int ticksPerWheel, TimeUnit timeUnit)

定时轮的构造方法只有三个参数:tickDuration(一个tick的持续时间),ticksPerWheel(一轮的tick数),timeUnit(时间单位)。例如:当tickDuration=1,ticksPerWheel=60,timeUnit=秒,这就和钟表的秒针走动完全一样,所有对象从加入定时轮到执行的等待时间都是60秒。

使用说明


举报/反馈