XXL-job 介绍及源码分析
官方github: https://github.com/xuxueli/xxl-job
xxl-job是一款基于spring, quartz,netty开源定时任务框架,解决的问题是不用每一个job-client都需要集成quartz,管理cron配置,尤其job很多的时候当容器启动会执行一堆job,影响启动速度。
原理简单而言就是由job配置中心管理通过quartz 控制客户端job触发时机,然后通过netty rpc 调用执行客户端的具体实现。这样中心化的方式可以极大改善job的管理成本,也可以配置集群,加上本身框架的轻量级,用起来还是可以的。不过稍微有那么一点鸡肋,在我看来如果用spring-cloud项目,我更倾向于用spring-cloud-stream 消息系统来触发执行客户端实现,用redis锁管理分布式job,这样更加高可用。因为以我的经验来看,如果项目中job承载了很重要的角色,那么在高并发的时候mysq相对于kafka/rabbit和redis来说更容易奔溃,所以选择用消息系统+redis方式管理重要job更加的高可用(ps: 之前被数据库方式的分布式job坑惨了)。
详细解读
一 架构分析
二 xxl-job-core
三 xxl-job-admin
- 调度模块中的所有调度任务使用同一个QuartzJobBean,即RemoteHttpJobBean。不同的调度任务将各自参数维护在各自扩展表数据中,当触发RemoteHttpJobBean执行时,将会解析不同的任务参数发起远程调用,调用各自的远程执行器服务。
RemoteHttpJobBean executeInternal()
JobTriggerPoolHelper.trigger(jobid,...)
JobTriggerPoolHelper.addTrigger(jobId...)
XxlJobTrigger.trigger(jobId,...) processTrigger(group, jobInfo, ...)
组织参数,通过group获取address runExecutor(triggerParam, address)
executorBiz.run(triggerParam) 具体远程执行