任务调度平台(xxl-job)部署安装及配置使用

架构设计 2020-12-29

由于公司需求,需要实现指定事件完成某些事件动作(例如双十一0点上架某款秒杀商品),这部分的功能原本计划基于定制化开发的模式,集成到现有的业务系统后台中。但考虑到公司同时运作的多个系统可能都会有这个需求,因此考虑上线一个任务调度平台,由任务调度平台统一进行任务调度。

系统选型

在接到需求后,马不停蹄的开始调研解决方案,目前网络上比较流行的有两款,分别是xxl-jobstaturn

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的性能和稳定需要考虑好。这里我选择使用云数据库,方便后期快速扩容。

  1. 首先连接数据库,创建xxl_job
  2. 下载对应的2.2.0版本的数据库初始化脚本,执行初始化

接下来进度系统本身的部署

xxl-job-admin部署

官方有提供调度中心的docker镜像,因此直接使用官方镜像即可。

  1. 创建workload,使用xuxueli/xxl-job-admin:2.2.0镜像
  2. 配置参数中指定安装初始化参数

安装初始化参数列表可以参考其配置文件

我这里配置了mysql连接信息以及smtp信息,我的参数示例如下:

PARAMS = --spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?Unicode=true&characterEncoding=UTF-8 --spring.datasource.username=root --spring.datasource.password=ktsee --xxl.job.login.username=admin --xxl.job.login.password=ktsee --xxl.job.accessToken=ktsee --spring.mail.host=smtp.ktsee.com --spring.mail.username=xxljob@ktsee.com --spring.mail.password=ktsee

配置service,指定该服务对外暴露端口8080,假设该服务对外地址是https://xxl-job.ktsee.com,接下来就可以访问以下地址进入后台:

https://xxl-job.ktsee.com:8080/xxl-job-admin

用户名和密码为刚刚参数里配置的adminktsee

登录界面

执行器部署

执行器的部署没有官方现成的docker镜像,同时各公司的开发环境也不同,因此推荐自行编写docker镜像以适配自己的业务开发环境。

由于我们公司业务开发的主要语言是PHP,这里就部署一个支持PHP的执行器环境。

  1. 创建workload,使用surenkid/xxl-job-executor镜像
  2. 配置参数中指定初始化参数

初始化参数可以参考其配置文件

我这里配置的执行器配置同样给一个示例:

PARAMS = --xxl.job.admin.addresses=https://xxl-job.ktsee.com:8080/xxl-job-admin --xxl.job.executor.appname=ktsee-php-job

参数中配置了调度中心的地址,以及执行器识别名,用于调度中心后台自动识别执行器用

配置调度任务

注册执行器

首先进入执行器管理,连接我们刚刚部署的执行器。点击新增执行器

新增执行器

在上面的界面中AppName填入刚刚配置参数里的ktsee-php-job

名称可以自己自由填写。由于我们刚刚配置参数里已经指定了调度中心的地址,因此这里注册方式保持自动注册即可。保存后在Online机器地址一栏可以看到已经成功注册的执行器

执行器节点

这样就完成了执行器的注册

创建调度任务

接着开始创建调度任务,进入任务管理,新增一个任务

创建调度任务

  • 执行器指定刚刚注册的PHP执行器,任务描述简单填写一下。
  • Cron这里指定任务需要调度的时间计划,比如双十一0点需要上架的商品,这里可以指定具体时间
  • 运行模式这里选择GLUE(PHP),我们的执行器环境是支持的,如果执行器环境不支持,将会运行失败
  • 负责和和报警邮件简单填写一下,我们之前在参数中配置了smtp服务,因此该任务异常时,会邮件通知到负责人和报警邮箱里
  • 任务参数为执行该调度任务传入的参数,比如上架的商品id等,对于一些常规性任务,使用参数可以避免重复创建任务。

完成任务创建之后,我们要开始编辑任务脚本,后台给我们提供了一个ide,直接进入该界面编写即可

glue ide

完成编写后保存,可以点击执行一次,测试任务执行效果,测试无误后,点启动保持任务正常运行即可。

跟踪调度日志

在任务调度日志界面,可以看到任务具体的执行日志

调度日志

总结

至此,任务调度平台就完成了部署,该平台基本可以代替Linux内置的任务调度,同时内建的调度机制,可以在一定量的负载下保证调度任务的顺利执行,同时在任务日志方面的处理也是比较容易跟踪的。目前来说基本符合公司的需求。

除了使用后台调度,同时也支持通过API方式直接调度任务。这部分需要结合具体的应用场景进行进一步配置。


本文由 surenkid 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

只有地板了

  1. 哦,我想多了
    哦,我想多了

    启动容器过后,无法连接数据库

添加新评论