分布式、微服务分布式架构

分布式任务调度平台 XXL-JOB

2019-11-13  本文已影响0人  进击的阿黑

参考 分布式任务调度平台xxl-job

源码下载地址 https://github.com/xuxueli/xxl-job/releases

一、需求背景

以往系统中的周期性任务执行,一般有以下几种方式

此时,又会出现以下的问题

二、什么是xxl-job

XXL-JOB是一个轻量级分布式任务调度平台,支持通过 Web 页面对任务进行 CRUD 操作,支持动态修改任务状态、暂停/恢复任务,以及终止运行中任务,支持在线配置调度任务入参和在线查看调度结果。

它的特点有:

平台:

任务:

三、概念说明

任务

调度任务,系统角色中的最小单元

调度中心

统一管理任务调度平台上的调度任务,负责触发调度执行,并提供可视化平台管理

执行器

主要负责接收“调度中心”的调度并执行

四、安装启动

下载

https://github.com/xuxueli/xxl-job

环境要求

入门

sql脚本在源码内,用navicat工具导入即可

doc/db/tables_xxl_job.sql
- xxl_job_lock:任务调度锁表;
- xxl_job_group:执行器信息表,维护任务执行器信息;
- xxl_job_info:调度扩展信息表: 用于保存XXL-JOB调度任务的扩展信息,如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等;
- xxl_job_log:调度日志表: 用于保存XXL-JOB任务调度的历史信息,如调度结果、执行结果、调度入参、调度机器和执行器等等;
- xxl_job_logglue:任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能;
- xxl_job_registry:执行器注册表,维护在线的执行器和调度中心机器地址信息;
- xxl_job_user:系统用户表;
xxl-job-admin:调度中心
xxl-job-core:公共依赖
xxl-job-executor-samples:执行器Sample示例(选择合适的版本执行器,可直接使用,也可以参考其并将现有项目改造成执行器)
    :xxl-job-executor-sample-springboot:Springboot版本,通过Springboot管理执行器,推荐这种方式;
    :xxl-job-executor-sample-spring:Spring版本,通过Spring容器管理执行器,比较通用;
    :xxl-job-executor-sample-frameless:无框架版本;
    :xxl-job-executor-sample-jfinal:JFinal版本,通过JFinal管理执行器;
    :xxl-job-executor-sample-nutz:Nutz版本,通过Nutz管理执行器;

五、开发

任务运行模式主要有Bean模式和Gule模式(理解为脚本)

BEAN模式

在该模式下,任务的具体实现逻辑是 以JobHandler的形式存在于“执行器项目”中。

这里只要copy 项目xxl-job-executor-sample-springboot 即可

logging:
  config: "classpath:logback.xml"
server:
  port: 8081
xxl:
  job:
    accessToken: ''
    admin:
      addresses: http://127.0.0.1:8080/xxl-job-admin
    executor:
      appname: xxl-job-executor-test
      ip: ''
      logpath: /data/applogs/xxl-job/jobhandler
      logretentiondays: -1
      port: 9999


import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.JobHandler;
import com.xxl.job.core.log.XxlJobLogger;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * <p>Title:lyy-modular-saas-api</p>
 * <p>Desc: 运行模式为Bean模式</p>
 * 开发步骤:
 * 1、继承"IJobHandler":“com.xxl.job.core.handler.IJobHandler”;
 * 2、注册到Spring容器:添加“@Component”注解,被Spring容器扫描为Bean实例;
 * 3、注册到执行器工厂:添加“@JobHandler(value="自定义jobhandler名称")”注解,注解value值对应的是调度中心新建任务的JobHandler属性的值。
 * 4、执行日志:需要通过 "XxlJobLogger.log" 打印执行日志;
 * @author Jerry
 * @version 1.0
 * @since 2019/8/8
 */
@JobHandler(value = "testJobHandler")
@Component
public class TestJobHandler extends IJobHandler {

    @Override
    public ReturnT<String> execute(String s) throws Exception {
        XxlJobLogger.log("################# start to job test");

        for (int i = 0; i < 5; i++) {
            XxlJobLogger.log("beat at:" + i);
            TimeUnit.SECONDS.sleep(2);
        }
        XxlJobLogger.log("################# end to job test");
        return SUCCESS;
    }
}

actuator.jpg task.jpg console_log.jpg

可以看到,这里成功执行了先前自定义的调度任务,并输出了log,结合代码分析,任务执行的log通过XxlJobLogger.log记录并写到日志表内,调度中心后台读取日志表得到详细的log

GLUE模式

任务以源码方式维护在调度中心,支持通过Web IDE在线更新,实时编译和生效,因此不需要指定JobHandler

拿GULE模式(JAVA)来解释,每一个GLUE模式的代码,在“执行器”接受到调度请求时,会通过Groovy类加载器加载出代码,并实例化成Java对象,同时注入此代码中声明的Spring服务(这里要确保代码中所引用的类或服务在“执行器项目中存在”),接着调用该对象的execute方法,执行具体的任务逻辑。

task_glue.jpg web_ide.jpg

任务执行失败-邮件告警

### 这里是用腾讯企业邮箱测试
spring.mail.host=smtp.exmail.qq.com
spring.mail.port=465
spring.mail.username=error@leyaoyao.com
spring.mail.password=123456

相关的处理逻辑在调度中心的JobFailMonitorHelper类中

分片广播&动态分片

执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发对应集群中所有执行器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务。

使用场景:

  1. 分片任务场景:10个执行器的集群来处理10w条数据,每台机器只需要处理1w条数据,耗时降低10倍;

  2. 广播任务场景:广播执行器机器运行shell脚本、广播集群节点进行缓存更新等

六、架构设计

设计思想

系统组成

架构图

architecture.png

架构特性

通讯流程分析

上一篇 下一篇

猜你喜欢

热点阅读