在日常开发中除了给前端开发接口,还要写一些定时处理任务,比如一个活动需要每天定时给所有用户派发奖励。一个成熟服务框架需要一个全局的定时任务调度中心,通过定时任务调度中心可以查看服务有哪些定时任务以及定时任务的执行情况,对于执行失败的定时任务可以手动执行等。
我们公司的微服务架构没有定时任务调度中心,每个服务通过类似crontab
定时任务配置来管理自身的定时任务,为了保证每个服务高可用,我们给每个服务都部署了两个节点,对于一些不能并发执行的定时任务我们往往需要给定时任务加一个分布式锁,有时甚至需要修改服务的crontab
定时任务配置,保证一组服务只一个服务能执行定时任务,对于定时任务执行情况没有一个统一地方可以查看,需要查看每个服务日志才能确认定时任务是否执行成功,对于执行失败的定时任务需要写额外的重做代码。所以我们需要一个定时任务调度中心来管理每个服务的定时任务,这个定时任务调度中心需要有以下功能:
- 可以查看服务有哪些定时任务以及任务的执行状态。
- 对于执行失败的定时任务可以在管理界面手动发起重做。
- 每个定时任务都抽象成接口,由定时任务调度中心负责调度。
- 定时任务什么时候执行应由具体业务服务配置,定时任务调度中心可获取这些配置进行定时调度。
既然决定开发一个定时任务调度中心,那么问题来了,我们是否需要开发一个新的服务?我的答案是不需要,我们把定时任务当作服务接口,我们所有服务的接口信息都登记到服务注册中心,我们可以给接口添加一个定时任务标签,注册中心将打上定时任务标签的服务接口放到一个定时任务执行队列中,由定时任务执行队列管理每个服务定时任务接口的调度,同时将各个服务的定时任务接口与执行情况记录到数据库中,然后在注册中心添加