背景
定时任务是每个业务常见的需求,比如每分钟扫描超时支付的订单,每小时清理一次数据库历史数据,每天统计前一天的数据并生成报表等等。
在Java中自带的解决方案:
- Jdk timer:固定频率执行,同一个线程串行执行
- Jdk ScheduledExecutorService:固定频率执行,支持多线程并发执行,解决timer串行的问题。
以上两种方案都不支持cron表达式,在分布式架构下也不支持幂等执行,一般用的比较少。
Spring中解决方案:
- Spring task:支持cron表达式,使用比较轻量,适用于单节点的应用,分布式架构下不支持幂等执行,需要业务自己做抢锁。
- Quartz:Springboot2.0版本支持quartz集成,可以结合数据库做持久化,框架封装抢锁触发逻辑,解决Spring task不支持幂等执行的问题。
如上解决方案都无可视化界面,运维比较麻烦,且无报警,在生产环境容易出问题。Spring Cloud Alibaba定时任务是阿里巴巴基于SchedulerX2.0开发的企业级定时任务解决方案,只需要在application文件中定义自己的任务,就可以一键部署起来,具有环境隔离、应用隔离、高可用、低延时、可视化、可报警等能力。
优势
Spring原生
支持Springboot声明式定义,命名空间、应用、任务、报警等都通过配置文件声明,方便管理自己应用下的任务,并且可以支持修改。可以拿到任何环境一键启动应用。
高可用
SchedulerX2.0采用高可用架构,任务多备份机制,经历阿里集团多年双十一、容灾演练,可以做到整个集群挂掉任意一个机房,任务调度都不会收到影响。
可视化
schedulerx拥有丰富的可视化能力,比如
- 用户大盘
- 查看任务历史执行记录