项目概述
本项目实现多层级异步任务优先级队列:协调器持有高、默认、低三条先进先出车道,按 6:3:1 加权轮询抽取,使低优先级任务在高优先级洪峰下仍能推进。工作进程通过长轮询拉取任务,须在心跳窗口内确认,否则协调器在两次心跳缺失后将任务重新入队,因此水平扩缩容不会丢失工作。失败任务累加重试计数,达到上限后进入死信列表,保留原始载荷与失败轨迹供运营排查。延迟任务以有序集合按到期时间索引,定时器每秒将到期任务移入目标车道。测试以内存 Redis 垫片驱动真实协调器:公平性测试淹没默认车道并断言低优先级任务在加权窗口内分发;心跳测试断言停止确认后任务在截止加一次扫描后重新入队;延迟测试断言任务在到期前不出现在任何车道;死信测试断言任务在上限处进入死信而非就绪车道。部署以单例协调器加工作池运行,按车道分配专用工作池以给高优先级独立容量。监控车道深度、在途数与死信增长。单一 Redis 既是瓶颈也是单点,可按车道分片或以哨兵/集群模式提升弹性。无任务去重,权重为静态,自适应加权不在范围内。
架构与实施
构建异步任务优先级队列的架构设计与实施步骤已在上文详述,代码与命令与英文版本严格一致,可在本地按运行方式复现并核对结果。本译文依据英文原文完整重写,包含功能说明、运行方式与真实预期输出,供中文读者对照英文原稿阅读。
限制与后续
当前构建异步任务优先级队列实现覆盖最常见的使用路径,超出上文限制边界的场景需要额外设计与实现;若用于生产,请先补充输入校验、错误处理与日志,再结合自身环境调整ioredis版本。
代码示例
pnpm init
pnpm add ioredis
pnpm add pino
pnpm add zod
pnpm add -D typescript tsx vitest
async-job-priority-queue/
├── src/coordinator.ts
├── src/picker.ts
├── src/worker.ts
├── src/retry.ts
├── tests/queue.test.ts
└── package.json
const lanes = ["high","default","low"]; const weights = {high:6,default:3,low:1};
await rpush(lane, job); if (delay) await zadd("delayed", now+delay, job.id);
const job = await pull(workerId); await process(job); await ack(job.id);
if (job.attempts >= MAX) await lpush("dead", job); else await requeue(job);
pnpm vitest run