Timing Wheel 简单实现

在实际需求中总是会有一些定时释放资源的场景,比如各种长链接、带有业务上限时的实体等等。

TimingWheel算法可以说是有很广的应用了,各种实现版本对应不同场景。结构如图所示:

关于算法的介绍可参考以下两个地址:

http://www.360doc.com/content/12/0917/07/7775902_236502748.shtml

http://blog.csdn.net/mindfloating/article/details/8033340

第二个链接的csdn博主有一个实例分享,代码简单易懂。

我有两个问题,这个实现是没有解决的:

1. Wheel转动一次的时间间隔是可以通过参数传递来定义的,比如说一个小时。那么我在1:00启动这个TimingWheel,在1:30添加进一个新元素。其实我是希望在11:30的时候释放掉,但是结果会怎么样,会比预想的时间提前30分钟。这就是同一槽内的元素,释放时间是一样的,根据添加时间的不同,有效期会有偏差。Wheel转动越慢,偏差就越大。

2. Wheel的转动应该与元素释放无关,也就是释放元素的操作是异步执行。避免单个元素释放时延导致整个Wheel都在等待。

3. Wheel应该有状态,保证每一个添加进来的元素都可以被正确释放。不应该Wheel调用shutdown了,元素不再做任何处理。(其实这里应该有点争议,是否shutdown后全部释放,还要根据场景需要进行调整。衡量释放处理是CPU密集型还是IO密集型,压力过大导致什么样的结果)

下面是小弟的实现,还有不成熟的地方请多指教。

 

先介绍一下每个类:

Wheel.java    时间轮

WheelState.java   时间轮状态

Slot.java    轮槽

Clocker.java    时间轮的推动器。每秒钟推动一次Wheel,并把过期槽内的元素都转移到释放池中。

RealeasePool.java    释放池。里面是一个阻塞队列,凡是进入这里的元素都会被释放掉

ExpirationIntecepter.java   释放方法接口

猜你喜欢

转载自biocy.iteye.com/blog/2006928