此文已由作者杨凯明授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
1.背景
目前项目中使用的定时任务框架存在下面这些问题
没有统一的定时任务管理平台
目前项目中使用定时任务的方式比较混乱,有部分系统使用了cron插件,有部分系统直接使用的spring task注解配置,没有一个统一的管理平台。使用cron插件的定时任务的配置集成在ms后台,管理页面比较简陋,需要一个更加友好、功能更加完善的管理系统,专门负责定时任务的管理,包括定时任务的创建、修改、删除、触发、查看历史等
对每个定时任务没有完善的监控
目前项目中没有对定时任务的监控,无法知道定时任务的执行情况和执行时间;当定时任务没有触发时没有告警;没法查看定时任务的执行历史情况
单点问题
目前使用spring task或quartz来做定时任务的系统,都需要手动指定运行定时任务的机器,这样会导致某台机器负载很高,并且如果这台机器宕机了则定时任务都不会执行
重复执行问题
有些定时任务本身不是幂等的,如果重复执行的话会有很多问题,比如短信的定时发送等;目前cron出现过zk断开后,导致定时任务被重复执行的情况
针对这些问题,需要设计一种能解决上述问题的新框架
2.设计
设计目标:
定时任务统一配置、统一管理
支持动态修改任务状态,动态暂停/恢复任务,即时生效
减少使用方的限制依赖
定时任务不遗漏、不重复的被执行
支持任务分片并发执行
完善的监控、统计功能
整个框架分为四部分:
调度服务器管理平台:负责定时任务的配置和管理,并定时进行任务的分配;获取每次任务执行的结果进行统计
任务执行器:通过心跳更新服务器信息;获取配置的任务信息定时执行任务,并根据任务执行情况上报执行结果
zk集群:存储任务配置信息和服务器节点信息;提供分布式协调服务
数据库:记录任务的每次执行情况,用于监控和统计