Expand description
§高性能异步定时器系统
基于时间轮(Timing Wheel)算法实现的高性能异步定时器,支持 tokio 运行时。
§特性
- 高性能: 使用时间轮算法,插入和删除操作的时间复杂度为 O(1)
- 大规模支持: 能够高效管理 10000+ 并发定时器
- 异步支持: 基于 tokio 异步运行时
- 线程安全: 使用 parking_lot 提供高性能的锁机制
§快速开始
use kestrel_protocol_timer::{TimerWheel, TimerTask};
use std::time::Duration;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 创建定时器管理器
let timer = TimerWheel::with_defaults();
// 步骤 1: 创建定时器任务
let task = TimerWheel::create_task(Duration::from_secs(1), || async {
println!("Timer fired after 1 second!");
});
let task_id = task.get_id();
// 步骤 2: 注册定时器任务
let handle = timer.register(task);
// 等待定时器触发
tokio::time::sleep(Duration::from_secs(2)).await;
Ok(())
}§架构说明
§时间轮算法
时间轮是一个环形数组,每个槽位存储一组定时器任务。时间轮以固定的频率(tick)推进, 当指针移动到某个槽位时,该槽位中的所有任务会被检查是否到期。
- 槽位数量: 默认 512 个(可配置,必须是 2 的幂次方)
- 时间精度: 默认 10ms(可配置)
- 最大时间跨度: 槽位数量 × 时间精度(默认 5.12 秒)
- 轮次机制: 超出时间轮范围的任务使用轮次计数处理
§性能优化
- 使用
parking_lot::Mutex替代标准库的 Mutex,提供更好的性能 - 使用
FxHashMap(rustc-hash)替代标准 HashMap,减少哈希冲突 - 槽位数量为 2 的幂次方,使用位运算优化取模操作
- 任务执行在独立的 tokio 任务中,避免阻塞时间轮推进
Structs§
- Batch
Config - 批处理配置
- Batch
Handle - 批量定时器句柄,用于管理批量调度的定时器
- Batch
Handle Iter - BatchHandle 的迭代器
- Completion
Notifier - 完成通知器,用于在任务完成时发送通知
- Completion
Receiver - 完成通知接收器,用于接收定时器完成通知
- Service
Config - 服务配置
- Service
Config Builder - 服务配置构建器
- TaskId
- 定时器任务的唯一标识符
- Timer
Config - 顶层定时器配置
- Timer
Config Builder - 顶层定时器配置构建器
- Timer
Handle - 定时器句柄,用于管理定时器的生命周期
- Timer
Service - TimerService - 基于 Actor 模式的定时器服务
- Timer
Task - 定时器任务
- Timer
Wheel - 时间轮定时器管理器
- Wheel
Config - 时间轮配置
- Wheel
Config Builder - 时间轮配置构建器
Enums§
- Timer
Error - 定时器错误类型
Traits§
- Timer
Callback - 定时器回调 trait
Type Aliases§
- Callback
Wrapper - 回调包装器类型