概述
XXL-JOB 是国内非常流行的开源任务调度系统,GitHub 上 star 28k,Gitee 上 star 13k。XXLJOB 简单易上手,不但有控制台可以动态管理定时任务,还有一些开箱即用的可观测能力。但是把XXL-JOB应用在生产环境上,很多企业遇到了一些问题。因此他们期望能有一款企业版的 XXL-JOB 服务,不改变用户使用习惯,解决开源痛点,提供最小的迁移成本。于是,阿里云任务调度XXL-JOB版 迎来重磅发布,以任务调度SchedulerX为内核,0代码改造,完全兼容开源XXL-JOB客户端接入。
开源XXL-JOB的5大常见问题
调度量有限
开源XXL-JOB多个调度节点通过数据库抢锁,每次拉取部分调度任务,从而实现多个调度节点“协同式”运行任务。因为每次调度还是要进行数据库抢锁,调度节点负载无法打满,当调度量到一定程度,继续扩容调度节点,调度量也无法上升,存在瓶颈。
稳定性问题
- 开源XXL-JOB非常耗数据库,每次调度会在xxl_job_log表生成调度记录,100个秒级别任务,一天就能生成100*60*60*24=864w记录,比较容易把数据库拖垮:
- 开源XXL-JOB每次调度都需要捞取数据库数据,当数据库数据量大或其他原因导致查询缓慢时,就会导致任务漏触发的问题:
安全薄弱
XXL-JOB账号只有管理员和普通用户,且只支持用户名密码登录,对于想通过SSO登录,并且精细化管理用户权限的企业不太适用
并且XXL-JOB客户端接入,是整个集群共享一个AccessToken,很容易导致越权连到其他执行器组下。
邮件报警不及时
XXL-JOB只支持邮件报警,一般人不会实时关注邮件,任务失败没法及时通知到联系人容易导致线上故障。同XXL-JOB也不支持联系人管理,如果某个同事离职了,就需要修改所有任务的邮件配置,管理很麻烦。
版本间不兼容
XXL-JOB多个版本间不兼容,比如想把2.2.0升级到2.3.0以上版本,客户端编程接口发生了改动,升级改造量大:
更重要的是,服务端通信协议和数据库表结构都发生了改变,导致无法直接平滑升级,对于企业想要自己维护调度节点挑战非常大。
阿里云XXL-JOB有哪些优势
阿里云XXL-JOB版以SchedulerX为内核,兼容开源XXL-JOB的通信协议,提供0代码修改、无侵入托管开源XXL-JOB Executor的解决方案。不但解决了开源遇到的一系列痛点问题,还进行了许多的功能增强。
企业级可观测
阿里云XXL-JOB默认集成了云监控大盘、日志服务SLS、消息中心等多个云产品,对可观测能力做了增强,给用户企业级的可观测能力,可以更快收到通知、更快定位问题。
- 报警服务:集成云监控报警能力,支持报警联系人,支持短信/电话/邮件/webhook报警方式。
- 调度历史:通过数据库存储最近执行的历史记录,通过日志服务归档历史执行记录,可以查看最近2个月所有的调度历史。
- 操作记录:集成阿里云操作审计服务,可以看到所有控制台/OpenApi 操作的历史事件。
- 监控大盘:集成云监控/Prometheus 监控大盘能力,相对于开源只能看天级别的大盘,可以自定义周期粒度看到更精细化的大盘。
高可用
阿里云XXL-JOB久经考验,在内核层面解决了开源和生产上遇到的一些列稳定性问题。在架构层面采用同城多机房容灾、管控面数据面分离、数据多备份等技术,保证了集群高可用,SLA能做到99.95%以上
阿里云XXLJOB高可用架构
- 管控面负责将任务负载均衡到不同的数据面server上调度,以及server的容灾管理。
- 数据面server负责任务调度,不同server调度不同的任务。
- 管控面和数据面都做到多可用区容灾。
- 管控面挂了,不会影响存量任务调度。
- 数据面某个server或者某个可用区的server全挂了,管控面都能切换到另一个可用区的server调度。
高安全
阿里云XXL-JOB从控制台登录到客户端接入都做了安全增强:
- 多租户:支持阿里云账号、RAM账号、角色账号、SSO单点登录,相对于开源的用户名密码登录更加安全。
- RAM权限:支持RAM权限管理,可以做到不同资源,不同操作级别的细粒度权限控制,比如给部分用户只读权限。
- 客户端鉴权:每个应用使用不同的AccessToken鉴权,相对于开源整个集群级别鉴权,更加安全。
高性能
阿里云XXL-JOB采用分布式架构,不同的调度节点负责不同的任务调度,不需要进行抢锁,经我们压测结果验证,在同样的规格下,性能比开源高一倍以上。且阿里云XXL-JOB可以通过水平扩容调度节点支撑更多的任务调度,没有性能瓶颈。
功能增强
阿里云XXL-JOB不但提供高可用、高安全、高性能、和可观测的企业级能力,还做了许多的功能增强,与开源详细对比可以看下表:
功能集 |
功能 |
开源XXLJOB |
阿里云XXLJOB |
兼容性 |
协议兼容 |
不同版本间不兼容 |
兼容v2.2.x以上所有版本 |
基础能力 |
调度类型 |
cron、fixed_rate |
cron、fixed_rate、fixed_delay、one_time、api |
时区 |
无 |
✅ |
|
自定义日历 |
无 |
✅ |
|
指定开始时间 |
无 |
✅ |
|
广播分片 |
不支持聚合 |
支持聚合 |
|
运维动作 |
手动运行、停止 |
手动运行、停止、原地重跑、重刷数据 |
|
工作流 |
无 |
✅ |
|
可观测能力 |
调度事件 |
无 |
✅ |
操作记录 |
无 |
✅ |
|
日志 |
存在客户端,每次执行产生一个小文件,有性能和稳定性问题 |
存储在日志服务,支持查看最近2个月日志 |
|
报警监控 |
报警方式 |
邮件 |
邮件、webhook、短信、电话 |
报警联系人 |
无 |
集成云监控联系人 |
|
报警历史 |
无 |
✅ |
|
稳定性 |
任务并发控制 |
客户端控制,多个executor无法做到幂等执行 |
服务端控制,可以做到全局幂等执行 |
应用限流 |
无 |
✅ |
|
优雅下线 |
无 |
✅ |
|
任务灰度 |
无 |
✅ |
阿里云XXLJOB与开源功能对比表
如何平滑迁移到阿里云XXLJOB
阿里云XXL-JOB提供了自建平滑迁移方案,不需要开发介入,只需要运维操作,就可以做到0代码修改,平滑迁移到云上。
前提条件
将自建XXL-JOB迁移到阿里云XXL-JOB,需要将您的Executor部署到有阿里云网络的机器上。如果您是阿里云用户,默认网络就通了。如果您的机器在其他云上或者自建IDC机房,也可以通过cen网络来和阿里云网络打通。
步骤一:从自建XXLJOB导出任务
我们提供了一个迁移工具,可以批量导出自建XXLJOB中所有任务信息,转成阿里云XXLJOB的文件格式
步骤二:导入到阿里云XXL-JOB
登录阿里云XXL-JOB控制台,点击任务管理->导入任务,将步骤一导出的文件一键导入到阿里云上
步骤三:重新部署应用
在阿里云XXL-JOB控制台上,找到接入配置信息,如下图
重启Java应用,通过-D参数带上xxl.job.admin.address等配置,就能将Executor接入到阿里云XXL-JOB了。