分布式Job任务调度平台幂等性解决方案【XXL-Job】
传统定时任务调度的缺陷:
1、没有补偿机制,如每天晚上2点定时执行一个任务,但期间抛出异常,则只能等到第二天晚上2点才能执行。
2、不支持集群
3、不支持路由策略
4、没有job管理平台【方便查看哪些任务执行成功,哪些任务没执行成功,需要手动补偿】
5、重试多次仍然失败,则发送报警邮箱
分布式集群的情况下,怎么保证定时任务不被重复执行?
比如我有3个tomcat组成的集群,每次项目启动时3个tomcat都会启动定时任务,那么这个定时任务则被执行了3次,这个问题也就转化为了:分布式job怎么解决幂等性问题。
解决方案
①使用zookeeper实现分布式锁,保证只有一台服务器执行job 缺点(需要创建临时节点和事件通知不易于扩展)
②使用配置文件开关。如jobstart = true 执行job / jobstart = true 不执行job 缺点:发布后,需要重启
③数据库唯一约束,同时插入有主键冲突,谁插入成功谁执行 缺点:效率低
以上的做法虽能保证分布式集群下定时任务不被重复执行,但失去了定时任务集群的意义,因为某一时刻只有一台服务器执行定时任务,所以④使用分布式任务调度平台 产品包含:XXLJOB,elastic-job等
xxl-job
分布式任务调度平台官方文档
http://www.xuxueli.com/xxl-job/#/?id=《分布式任务调度平台xxl-job》
官方文档写的十分详细