用途:在 NestJS 中实现分布式定时任务,解决多实例环境下 @Cron 重复执行的问题。
主要能力:
- 注册定时模块:在 AppModule 中导入 ScheduleModule.forRoot()。
- 创建 cron 处理器:用 @Cron(CronExpression.*) 装饰服务方法。
- 分布式锁:应用 Redis 锁装饰器,防止多 Pod 重复运行;逻辑基于 Redis 原子 SET,示例为 SET resource_name my_random_value NX PX 30000。可选用 nestjs-redlock,或通过 redlock 库自定义 Redis 封装。
- 重活卸载:将任务 ID 推入 BullMQ,由 worker 处理,避免 cron 处理器被事件循环阻塞。
必要用法与步骤:
- 导入 ScheduleModule.forRoot()。
- 用 @Cron 装饰方法。
- 加 Redis 锁装饰器。
- 把重活以 Job ID 形式推入 BullMQ 队列。
- 用 try/catch 包裹全部 cron 逻辑。
- 用 2 个以上实例验证只有一个能获取锁。
限制与反模式:
- 不要在 cron 处理器中直接做重处理,应推入 BullMQ 队列。
- 不要在无 try/catch 保护下运行 cron 逻辑,未捕获异常会导致整个 Node 进程崩溃。
- 多 Pod 环境下不要裸用 @Cron,需配合分布式锁。
其他实现细节与代码示例暂未提供。