UML时间轮算法时间轮是一种高效、低延迟的调度数据结构。它在Linux内核中被广泛使用,是Linux内核定时器的实现方法和基础之一。按照使用场景,大致可以分为两种时间轮:原始时间轮和分层时间轮。分级时间轮是原有时间轮的升级版,用来应对时间“槽”数量比较多,对内存和精度要求较高的情况。延迟任务的场景一般只需要使用原来的时间轮。constructorpublicHashedWheelTimer(ThreadFactorythreadFactory,//定时任务是后台任务,需要启动线程,我们一般通过自定义threadFactory来命名线程,如果嫌麻烦,就用Executors.defaultThreadFactory()longtickDuration,//一个tick的长度,默认为100msTimeUnitunit,//一个tick的时间长度,默认为100msintticksPerWheel,//一圈有多少个tick,默认为512booleanleakDetection,//用于跟踪内存泄漏longmaxPendingTimeouts//允许等待的最大Timeout实例数,这是我们可以设置的,不允许等待太多的任务,如果未执行的任务数达到阈值,再次提交任务时会抛出RejectedExecutionException,默认不限){}原理分析1、HashedWheelTimer本质上是一个Timer,用于定时任务Execute,newTimeout用于添加任务,stop用于终止Timer执行。2、HashedWheelTimeout封装了要执行的任务TimerTask,记录了它属于哪个时间轮,被添加到哪个桶,以及前后节点的信息,并提供取消、删除、超时执行的能力。3、Worker封装了线程执行任务的能力。4.HashedWheelBucket维护了一个双向链表,存储要执行的任务,并提供了随着时间的推移增加、删除和执行任务的能力。使用场景时间轮是一种高性能、低消耗的数据结构,适用于非准实时、延迟时间短的快速任务,比如心跳检测。它在netty和kafka中都有使用。HashedWheelTimer的本质是一个类似于延迟任务队列的实现。其特性如上所述。适用于大量这种对时间不敏感,可以快速执行,并且可以做到高性能低消耗的“小”任务。.HashedWheelTimer时间轮是一种高性能、低消耗的数据结构。适用于非准实时、延时短时快的任务,如心跳检测、会话检测等。对于可靠性要求严格的延迟任务,时间轮目前并不是一个比较好的解决方案,原因如下:原有时间轮是单机的,在分布式、多实例部署场景下表现较弱;宕机后恢复执行,原来时间轮的存储是Mpsc队列,毫无疑问是内存存储。一旦发生宕机或重启,数据不可恢复;对于订单超时取消等场景,可以考虑timewheel+zk+db的实现,zk集中控制,避免多个节点重复执行超时任务,即Data去重,db作为持久化用于延迟任务的存储,可以在停机后恢复。HashedWheelTimer的应用场景一般包括:●心跳检测(客户端检测)●会话和请求超时●消息延迟推送●业务场景超时取消(订单、退款单等)参考文章https://www.bianchengquan。com。..https://www.jianshu.com/p/1eb...https://www.javadoop.com/post...
