项目概述
本项目实现延迟任务调度器:分层时间轮按到期 tick 分桶,入队与 tick 均 O(1)。长延迟溢出到内层轮,tick 推进时级联内层到外层如时钟分针进时针。按 id 取消从桶中移除。写前日志持久化每次入队与取消,重启顺序重放重建轮。失败以指数退避重新入队。测试 100 tick 任务前进 99 不运行再前进 1 运行;长延迟级联正确;取消后永不运行;崩溃重启从 WAL 恢复;入队与取消交错重放有序;百万任务 tick 成本有界;失败重试延迟增长至上限。部署单调度器单 setInterval,入队前 fsync WAL;tick 分辨率按精度选;定期快照截断 WAL 限恢复时间。轮在内存,WAL 丢失丢任务;无分布式调度;tick 分辨率固定亚 tick 取整。
架构与实施
构建延迟任务调度器的架构设计与实施步骤已在上文详述,代码与命令与英文版本严格一致,可在本地按运行方式复现并核对结果。本译文依据英文原文完整重写,包含功能说明、运行方式与真实预期输出,供中文读者对照英文原稿阅读。
限制与后续
当前构建延迟任务调度器实现覆盖最常见的使用路径,超出上文限制边界的场景需要额外设计与实现;若用于生产,请先补充输入校验、错误处理与日志,再结合自身环境调整node:fs版本。
代码示例
pnpm init
pnpm add -D typescript tsx vitest
delayed-job-scheduler/
├── src/wheel.ts
├── src/scheduler.ts
├── src/wal.ts
├── tests/scheduler.test.ts
└── package.json
const bucket = (currentTick + delay) % SIZE; wheel[bucket].push(job);
const due = wheel[currentTick++ % SIZE]; for (const job of due) dispatch(job);
wheel[bucket] = wheel[bucket].filter(j => j.id !== id);
await wal.append({op:"enqueue", job}); // on boot: for (const e of wal.read()) apply(e);
pnpm vitest run