说到定时轮,大家可能首先会想到时间轮,毕竟在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秒。
使用说明
举报/反馈