I
Member
写运维脚本时定时任务是刚需,crontab 和 APScheduler 我都长期用,选择逻辑其实很简单:
选 crontab 的情况:
- 任务独立、失败了人工介入就行;
- 服务器就一台,不用考虑分布式;
- 优点是简单可靠,系统级,脚本挂了不影响调度器本身。
选 APScheduler 的情况:
- 任务之间有依赖,或者要动态增删任务;
- 需要失败重试、超时控制、错过执行的补偿(misfire 处理);
- 要把调度状态持久化,出问题能查。
几个实践经验:
1. 用 crontab 一定要把标准输出和错误重定向到日志文件,不然出问题两眼一抹黑。
2. APScheduler 生产环境用 BackgroundScheduler + 数据库存储 jobstore,内存版的重启就丢任务。
3. 分布式场景加锁是必须的,不然多实例同时跑。我一般用 Redis 锁,简单够用。
4. 定时任务的第一行代码:打日志。什么时候开始、参数是什么,先记下来再干活。
大家现在新项目还用 crontab 吗,还是都上调度框架了?
选 crontab 的情况:
- 任务独立、失败了人工介入就行;
- 服务器就一台,不用考虑分布式;
- 优点是简单可靠,系统级,脚本挂了不影响调度器本身。
选 APScheduler 的情况:
- 任务之间有依赖,或者要动态增删任务;
- 需要失败重试、超时控制、错过执行的补偿(misfire 处理);
- 要把调度状态持久化,出问题能查。
几个实践经验:
1. 用 crontab 一定要把标准输出和错误重定向到日志文件,不然出问题两眼一抹黑。
2. APScheduler 生产环境用 BackgroundScheduler + 数据库存储 jobstore,内存版的重启就丢任务。
3. 分布式场景加锁是必须的,不然多实例同时跑。我一般用 Redis 锁,简单够用。
4. 定时任务的第一行代码:打日志。什么时候开始、参数是什么,先记下来再干活。
大家现在新项目还用 crontab 吗,还是都上调度框架了?