java 时间轮算法_Java入门到精通之Dubbo中的时间轮(Time Wheel)算法应用

本文深入探讨了Java中Dubbo框架利用时间轮算法实现高效定时任务管理的原理,包括时间轮模型、核心接口和实现,以及在Dubbo中的具体应用。通过对HashedWheelTimer的分析,展示了如何利用时间轮降低定时任务操作的时间复杂度。
摘要由CSDN通过智能技术生成

本篇通过定时任务、时间轮模型等等介绍了Java框架中Dubbo中的时间轮算法应用,希望对JAVA 的学习有所帮助。

370a1c3189e51ace37ca69bb95c8bc71.png

1 定时任务

Netty、Quartz、Kafka 以及 Linux 都有定时任务功能。

JDK 自带的 java.util.Timer 和 DelayedQueue 可实现简单的定时任务,底层用的是堆,存取复杂度都是 O(nlog(n)),但无法支撑海量定时任务。

在任务量大、性能要求高的场景,为了将任务存取及取消操作时间复杂度降为 O(1),会采用时间轮算法。

2 时间轮模型及其应用

一种高效批量管理定时任务的调度模型。一般会实现成一个环形结构,类似一个时钟,分为很多槽,一个槽代表一个时间间隔,每个槽使用双向链表存储定时任务。

指针周期性跳动,跳动到一个槽位,就执行该槽位的定时任务。

Hashed Timing Wheel 结构示意图

4f3ad0e3a188e40546721b40b87099c9.png

故障恢复

流量控制

调度算法

控制网络中的数据包生命周期

计时器维护代价高,如果

处理器在每个时钟滴答声中都会中断

使用精细粒度计时器

未完成的计时器很多

需要高效的定时器算法以减少总体中断的开销。

单层时间轮的容量和精度都是有限的,对于精度要求特别高、时间跨度特别大或是海量定时任务需要调度的场景,通常会使用多级时间轮以及持久化存储与时间轮结合的方案。

模型和性能指标

模型中的规则

客户端调用:

START_TIMER(时间间隔,Request_ID,Expiry_Action)

STOP_TIMER(Request_ID)

计时器tick调用:

PER_TICK_BOOKKEEPING

EXPIRY_PROCESSING

性能指标

空间

数据结构使用的内存

延迟

开始和结束上述任何例程所需的时间

3 Dubbo的时间轮结构

Dubbo 时间轮实现位于 dubbo-common 模块的 org.apache.dubbo.common.timer 包,下面我们就来分析时间轮涉及的核心接口和实现。

核心接口

37ef0855c758cc1f2f8b17c010814814.png

TimerTask

在 Dubbo 中,所有定时任务都要实现 TimerTask 接口。只定义了一个 run() 方法,入参是一个 Timeout 接口对象。

Timeout

Timeout 对象与 TimerTask 对象一一对应,类似线程池返回的 Future 对象与提交到线程池中的任务对象之间的关系。

通过 Timeout 对象,不仅可以查看定时任务的状态,还可以操作定时任务(例如取消关联的定时任务)。

Timeout 接口中的方法:

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值