定时任务调度:在某个时间点触发执行操作(CURD)。
分布式任务调度平台的使用场景:数据同步、交易信息(对账)、清除过期用户信息、定期发送报表、消息推送。
传统的定时任务与分布式定时任务的区别?
传统的定时任务特征:单点系统(job没有集群)
思考:如果job在高并发的情况下,导致job服务器宕机之后,这时候应该如何处理?
1.定时任务和业务服务放在用一个jvm中(小项目)
2.大型互联网公司定时任务代码执行与业务执行代码服务器都是分开的,都是独立的jvm。
3.定时任务服务器是否需要考虑高并发情况?需要,因为同一时间点可能执行多个任务。间隔执行场景不需要,同时执行需要考虑高并发情况。
4.如果在高并发情况下,定时job宕机后,该如何处理(只有一台服务器的情况下) ?使用心跳检测监控自动重启、补偿机制,每个任务做一个标记。
定时任务在执行代码的时候突然报错了,该如何处理?日志记录错误,跳过当前错的任务,接着执行下一个任务。在使用定时job扫描错误日志记录,进行补偿信息。
分布式定时任务特征:job使用集群。
产生问题:定时任务打成3个war包放在三个不同服务器上(8080、8081、8082)。定时任务在每个war包中都是相同的,三台服务器启动之后,定时job会被重复执行3遍。
分布式领域中服务器集群的情况下,如何保证job的幂等性?
1.使用zookeeper实现分布式锁方式,不推荐效率低。
2.在配置文件中加上打开定时job的开关8080 设置flag=true、8081 设置flag=false、8082设置 flag=false,这种方法不属于分布式了 属于单点的系统,不推荐。
3.启动的时候使用数据库的唯一标示,不推荐效率低。
4.使用分布式任务调度平台xxl-job、Elastric-job(依赖于zk)、TBSchedule。
分布式任务调度平台优点
xxl-job
1.支持集群(保证幂等性问题)、job负载均衡轮询机制。
2.支持job补偿,如果job执行失败的话,会自动实现重试机制,如果重启多次还是失败的话,会发送邮件给运维人员。
3.支持job日志记录。
4.动态配置定时规则,传统的定时job规则都是写死的。
.......
其他优点在文档中可以查看
xxl-job github地址:
https://github.com/xuxueli/xxl-job
xxl-job 文档:
xxl-job原理
执行器:定时job实际执行的服务器地址。
任务管理:配置定时任务的规则、路由策略、运行模式、报警邮箱。
xxl-job-Admin:单独的Web服务,是job的管理平台。
步骤:
1.在xxl-job admin平台创建执行器(job实际的执行地址)。
2.在xxl-job admin 平台新建任务,填写对应的执行器。
3.在job服务器代码中,使用JobHandler标示该类为job执行方法。
4.如果有任务需要执行的时候,先在xxl-job admin执行一次,获取任务中的执行器(实际job地址)。
执行器项目启动的时候,会将服务器本地信息注册到xxl-job平台,只要类上添加@JobHandler(value="name")注解 就会注册到xxl-job平台上。