由于公司需求,需要实现指定事件完成某些事件动作(例如双十一0点上架某款秒杀商品),这部分的功能原本计划基于定制化开发的模式,集成到现有的业务系统后台中。但考虑到公司同时运作的多个系统可能都会有这个需求,因此考虑上线一个任务调度平台,由任务调度平台统一进行任务调度。
系统选型
在接到需求后,马不停蹄的开始调研解决方案,目前网络上比较流行的有两款,分别是xxl-job和staturn。
这两者的区别在于,xxl-job较为轻量,它是基于mysql锁来保证任务的唯一性,因此性能瓶颈可能会在mysql端。而staturn是基于zookeeper分布式锁,性能较好但部署和学习成本会稍高一些。
考虑到项目时间紧迫度以及目前业务的负载程度,选择了较为轻量的xxl-job。
XXL-Job系统简介
xxl-job是由大众点评员工自行开发和开源的一款产品,根据官网的企业名录来看,目前使用的企业已经由400多家,可以说该系统的需求契合以及稳定性是经过一定验证的。
该系统主要的组成部分包含两块
- 调度中心
- 执行器
其中调度中心提供一个后台界面,在后台中可以创建和修改调度任务,指定不同的执行器来根据场景执行调度任务。
执行器提供任务执行的环境,可以根据不同公司的不同需求,部署不同环境的执行器。执行器在集群中部署,可以更加方便的做到服务扩容。
开始部署
由于公司的服务我已经基本改造成基于k8s集群的微服务架构,因此这次部署同样考虑以docker的方式进行部署。
下面开始我们的作业吧
调度中心部署
此次选择的是目前最新的稳定版2.2.0,调度中心的部署,我们分别两步进行
数据库初始化
由于xxl-job是基于mysql锁保证调度唯一性的,因此mysql的性能和稳定需要考虑好。这里我选择使用云数据库,方便后期快速扩容。
- 首先连接数据库,创建
xxl_job
库 - 下载对应的2.2.0版本的数据库初始化脚本,执行初始化
接下来进度系统本身的部署
xxl-job-admin部署
官方有提供调度中心的docker镜像,因此直接使用官方镜像即可。
- 创建workload,使用
xuxueli/xxl-job-admin:2.2.0
镜像 - 配置参数中指定安装初始化参数
安装初始化参数列表可以参考其配置文件
我这里配置了mysql连接信息以及smtp信息,我的参数示例如下:
1 |
|
配置service,指定该服务对外暴露端口8080,假设该服务对外地址是https://xxl-job.ktsee.com,接下来就可以访问以下地址进入后台:
https://xxl-job.ktsee.com:8080/xxl-job-admin
用户名和密码为刚刚参数里配置的admin
和ktsee
执行器部署
执行器的部署没有官方现成的docker镜像,同时各公司的开发环境也不同,因此推荐自行编写docker镜像以适配自己的业务开发环境。
由于我们公司业务开发的主要语言是PHP,这里就部署一个支持PHP的执行器环境。
- 创建workload,使用
surenkid/xxl-job-executor
镜像 - 配置参数中指定初始化参数
初始化参数可以参考其配置文件
我这里配置的执行器配置同样给一个示例:
1 |
|
参数中配置了调度中心的地址,以及执行器识别名,用于调度中心后台自动识别执行器用
配置调度任务
注册执行器
首先进入执行器管理,连接我们刚刚部署的执行器。点击新增执行器
在上面的界面中AppName填入刚刚配置参数里的ktsee-php-job
名称可以自己自由填写。由于我们刚刚配置参数里已经指定了调度中心的地址,因此这里注册方式保持自动注册即可。保存后在Online机器地址一栏可以看到已经成功注册的执行器
这样就完成了执行器的注册
创建调度任务
接着开始创建调度任务,进入任务管理,新增一个任务
- 执行器指定刚刚注册的PHP执行器,任务描述简单填写一下。
- Cron这里指定任务需要调度的时间计划,比如双十一0点需要上架的商品,这里可以指定具体时间
- 运行模式这里选择GLUE(PHP),我们的执行器环境是支持的,如果执行器环境不支持,将会运行失败
- 负责和和报警邮件简单填写一下,我们之前在参数中配置了smtp服务,因此该任务异常时,会邮件通知到负责人和报警邮箱里
- 任务参数为执行该调度任务传入的参数,比如上架的商品id等,对于一些常规性任务,使用参数可以避免重复创建任务。
完成任务创建之后,我们要开始编辑任务脚本,后台给我们提供了一个ide,直接进入该界面编写即可
完成编写后保存,可以点击执行一次,测试任务执行效果,测试无误后,点启动保持任务正常运行即可。
跟踪调度日志
在任务调度日志界面,可以看到任务具体的执行日志
总结
至此,任务调度平台就完成了部署,该平台基本可以代替Linux内置的任务调度,同时内建的调度机制,可以在一定量的负载下保证调度任务的顺利执行,同时在任务日志方面的处理也是比较容易跟踪的。目前来说基本符合公司的需求。
除了使用后台调度,同时也支持通过API方式直接调度任务。这部分需要结合具体的应用场景进行进一步配置。