从零玩转xxl-job分布式任务调度1

简介: 从零玩转xxl-job分布式任务调度

前言

任务调度场景

概述

1. 在平时的业务场景中,经常有一些场景需要使用定时任务

时间驱动的场景

1. 某个时间点发送优惠券,发送短信等等
2. 报表
3. 爬虫

批量处理数据

1. 批量统计上个月的账单,统计上个月销售数据等等

固定频率的场景

1. 每隔5分钟需要执行一次,等

为什么需要任务调度平台

在Java中,传统的定时任务实现方案,比如Timer,Quartz等

缺点

不支持集群、不支持统计、没有管理平台、没有失败报警、没有监控等等

分布式的架构中,有一些场景需要分布式任务调度

1. 同一个服务多个实例的任务存在互斥时,需要统一的调度
2. 任务调度需要支持高可用、监控、故障告警
3. 需要统一管理和追踪各个服务节点任务调度的结果,需要记录保存任务属性信息等

任务调度框架

1. 非分布式
 在单一个服务器当中,创建定时任务
  @Scheduled
2. 分布式
 把分散的,可靠性差的计划任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式,叫做分布式定时任务。
 2.1 Quartz
  先驱者
  无图形化界面
  接口不人性化
 2.2 Elasticjob
  基于Quartz
  elastic-job 是由当当网基于quartz 二次开发之后的分布式调度解决方案
  依赖很多中间件 zk,
 2.3 xxl-job
  美团点评里面开发者开发出来
 2.4 SchedulerX
  阿里云出的一个框架
  商用产品
 2.5 PowerJob
  个人
 2.6 对比

image_1647532503971.png

XXL-job

1. 本次使用的是2.3.0版本的
2. 我感觉有bug 启动多个服务xxl-job始终有一个服务是超时的

官网

1. https://www.xuxueli.com/xxl-job/
2. https://gitee.com/xuxueli0323/xxl-job/

概述

1. xxl-job是出自大众点评许雪里(xxl就是作者名字的拼音首字母)的开源项目,官网上介绍这是一个轻量级分布式任务调度框架,
2. 其核心设计目标是开发迅速、学习简单、轻量级、易扩展。跟elasticjob不同,xxl-job环境依赖于mysql,不用ZooKeeper,这也是最大的不同。
3. xxl-job中心式的调度平台轻量级,开箱即用,操作简易,上手快,与SpringBoot有非常好的集成,而且监控界面就集成在调度中心,界面又简洁,
4. 对于企业维护起来成本不高,还有失败的邮件告警等等。这就使很多企业选择xxl-job做调度平台。

系统组成

1. 调度模块(调度中心)
 1.1 负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。
 1.2 调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块; 
 1.3 支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover
2. 执行模块(执行器)
 1. 负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效; 接收“调度中心”的执行请求、终止请求和日志请求等
3. 功能架构图

image_1647532727880.png

2个角色

调度任务管理系统,xll-job-admin

1. 设置时间
2. 集群,使用的策略
3. 创建任务时会指定任务名称,地址

xxl-job-excutor,通常是我们业务系统

1. 配置上调度系统的地址 
2. 创建任务,在任务上指定任务名称

搭建调度中心

下载源码

1. https://github.com/xuxueli/xxl-job/releases/tag/2.3.0

执行SQL

1. /xxl-job-2.3.0/doc/db/tables_xxl_job.sql
2. 将sql文件执行创建数据库

修改xxl-job-admin项目当中的appication.properties配置

image_1647532957152.png

切换到xxl-job-admin目录当中打包

1. mvn clean -U package -Dmaven.test.skip=true

切换到target目录当中启动

1. java -jar xxl-job-admin-2.3.0.jar --server.port=8088
2. http://localhost:8088/xxl-job-admin/toLogin
3. 用户名与密码
 admin
 123456
4. 主界面

image_1647533046874.png

image_1647533011197.png

调度任务执行流程

1. 启动xll-job-admin调度模块,直接运行
2. xxl-job-excuotr需要配置xxl-job-admin的地址,主动向Xxl-job-admin注册
3. 流程图

image_1647533128715.png

执行器操作

创建springboot工程

image_1647533230826.png

导入依赖

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.3.0</version>
        </dependency>
    </dependencies>

添加配置文件

image_1647533356284.png

其他配置参考

image_1647533390752.png

配置

server:
  port: 8011
xxl:
  job:
    admin:
      addresses: http://127.0.0.1:8000/xxl-job-admin
    executor:
      appname: yby-job-2
      logpath: /Users/yangbuyi/Documents/分布式任务调度/log

创建配置类

@Component
@Slf4j
public class XxlJobConfig {
    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;
    @Value("${xxl.job.executor.appname}")
    private String appname;
    @Value("${xxl.job.executor.logpath}")
    private String logPath;
    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appname);
        xxlJobSpringExecutor.setLogPath(logPath);
        return xxlJobSpringExecutor;
    }
}


相关文章
|
3月前
|
存储 NoSQL 调度
|
5月前
|
NoSQL Java 调度
在Spring Boot中实现分布式任务调度
在Spring Boot中实现分布式任务调度
|
5月前
|
设计模式 存储 缓存
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
64 0
|
5月前
|
NoSQL Java 调度
在Spring Boot中实现分布式任务调度
在Spring Boot中实现分布式任务调度
|
6月前
|
调度
自己动手实现分布式任务调度框架(续)(2)
自己动手实现分布式任务调度框架(续)
|
6月前
|
消息中间件 负载均衡 Java
自己动手实现分布式任务调度框架(续)(1)
自己动手实现分布式任务调度框架(续)
|
7月前
|
分布式计算 Java 调度
[Java 探索者之路] 一个大厂都在用的分布式任务调度平台
[Java 探索者之路] 一个大厂都在用的分布式任务调度平台
|
7月前
|
SQL 调度 数据库
Docker部署Xxl-Job分布式任务调度中心(超详细)
Docker部署Xxl-Job分布式任务调度中心(超详细)
|
7月前
|
分布式计算 Ubuntu 调度
如何本地搭建开源分布式任务调度系统DolphinScheduler并远程访问
如何本地搭建开源分布式任务调度系统DolphinScheduler并远程访问
262 0
|
2月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
下一篇
DataWorks