SpringTask实现的任务调度与XXL-job实现的分布式任务调度【XXL-Job工作原理】

news2024/12/28 8:34:47

目录

任务调度

分布式任务调度

 分布式任务调度存在的问题以及解决方案

使用SpringTask实现单体服务的任务调度

XXL-job分布式任务调度系统工作原理

XXL-job系统组成

XXL-job工作原理

使用XXL-job实现分布式任务调度

配置调度中心XXL-job

登录调度中心创建执行器和任务

在pom文件中加入XXL-job依赖

在application.yml中设置参数配置

创建配置类并交给Spring容器的Bean进行管理

创建任务代码并通过@XxlJob注解指定处理器

参考链接


任务调度

        任务调度:系统为了自动完成特定任务,在约定的特定时刻去执行任务的过程。有了任务调度即可解放更多的人力由系统自动去执行任务。

        常见任务调度的应用场景:

  • 某电商系统需要在每天上午10点,下午3点,晚上8点发放一批优惠券。
  • 某银行系统需要在信用卡到期还款日的前三天进行短信提醒。
  • 某财务系统需要在每天凌晨0:10结算前一天的财务数据,统计汇总。
  • 12306会根据车次的不同,而设置某几个时间点进行分批放票。
  • 某网站为了实现天气实时展示,每隔5分钟就去天气服务器获取最新的实时天气信息。

分布式任务调度

        分布式任务调度: 当前软件的架构已经开始向分布式架构转变,将单体结构拆分为若干服务,服务之间通过网络交互来完成业务处理。在分布式架构下,一个服务往往会部署多个实例来运行我们的业务,如果在这种分布式系统环境下运行任务调度,我们称之为分布式任务调度

分布式任务调度是指通过合理的调度算法,在分布式环境下协调执行任务的一种机制。其目的是最大程度地提高任务执行效率、保障任务的可靠性和实时性。

        分布式任务调度主要强调两个方面:

  1. 分布式:在微服务架构下一个微服务实例具有多个实现,即集群模式。【分布式和微服务并不是一个概念,微服务强调的是将单个服务根据不同的业务逻辑进行拆分,而分布式强调的是针对具体的拆分的某个实例创建多个同样的服务以集群的方式存在。
  2. 分布式任务调度:本质仍然是上面提到的任务调度,唯一不同的是此时针对的是一个服务实例的多个实现进行的调度。

 分布式任务调度存在的问题以及解决方案

        由于分布式将某个业务服务创建多个相同的服务,故在每一个服务中均存在相同的任务调度程序,此时在相同时刻多个服务中的任务调度程序均会执行,从而造成业务故障。如:电商系统定期发放优惠券,就可能重复发放优惠券,对公司造成损失,信用卡还款提醒就会重复执行多次,给用户造成烦恼,所以我们需要控制相同的任务在多个运行实例上只执行一次。

        解决方案的出发点:控制相同的任务在多个运行实例上只执行一次。可以采用分布式锁、Zoopeeper选举的方式实现。

        分布式锁:多个实例在任务执行前首先需要获取锁,如果获取失败那么就证明有其他服务已经在运行,如果获取成功那么证明没有服务在运行定时任务,那么就可以执行。

        Zookeeper选举:利用ZooKeeper对Leader实例执行定时任务,执行定时任务的时候判断自己是否是Leader,如果不是则不执行,如果是则执行业务逻辑。

使用SpringTask实现单体服务的任务调度

  1. 添加Maven坐标。
  2. 启动类添加@EnableScheduling开启任务调度。
  3. 方法上添加@Scheduled注解,并设置cron表达式。

XXL-job分布式任务调度系统工作原理

XXL-job系统组成

        在XXL-Job的设计思路中将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑。因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性。

  • 调度中心: 负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块; 支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover

  • 执行器: 负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效; 接收“调度中心”的执行请求、终止请求和日志请求等。

XXL-job工作原理

  1. 任务执行器根据配置的调度中心的地址,启动注册线程向调度中心的执行器管理发起自动注册。执行器管理中保存着注册执行器,后续会根据这个注册信息给执行器下发任务。

  2. 如果此时有需要执行的任务,任务管理模块会根据执行器管理中注册的执行器信息,向任务执行器下发任务。任务执行器中的任务执行服务接受到任务以后会将任务发送到待执行任务的队列中,队列中的任务会由执行线程JobHandler依次获取并且执行。这里会维护一个任务执行的线程池,池中就是一个个JobHandler线程,它们是执行任务的主力军。

  3. JobHandler执行器基于线程池执行任务,并把执行结果放入执行结果队列中,同时会把执行日志写入任务日志文件中,以供日志查询。然后通知毁掉线程,告知任务执行完毕,回调线程会通知调度中心的监控运维模块,任务执行完毕。

  4. 用户可以在调度中心查看任务日志,其过程是通过发送日志查询请求给任务执行器中的日志服务,然后查询任务日志文件实现的。

使用XXL-job实现分布式任务调度

配置调度中心XXL-job

        下载源码,解压并利用Maven编译。

        在/xxl-job/xxl-job-admin/src/main/resources/application.properties文件中将数据库连接信息修改为自己的数据库。

        启动调用中心192.168.200.130:8888/xxl-job-admin,并使用 “admin/123456”默认账号登陆。

登录调度中心创建执行器和任务

在pom文件中加入XXL-job依赖

    <dependency>
        <groupId>com.xuxueli</groupId>
        <artifactId>xxl-job-core</artifactId>
        <version>2.3.0</version>
    </dependency>

在application.yml中设置参数配置

xxl:
  job:
    admin:
      addresses: http://192.168.200.130:8888/xxl-job-admin
    executor:
      appname: xxl-job-executor-sample
      port: 9999

        配置文件中的参数在创建配置类的时候需要使用到。

创建配置类并交给Spring容器的Bean进行管理

package com.heima.xxljob.config;

import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * xxl-job config
 *
 * @author xuxueli 2017-04-28
 */
@Configuration
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;

    @Value("${xxl.job.executor.appname}")
    private String appname;

    @Value("${xxl.job.executor.port}")
    private int port;


    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        logger.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appname);
        xxlJobSpringExecutor.setPort(port);
        return xxlJobSpringExecutor;
    }


}

创建任务代码并通过@XxlJob注解指定处理器

package com.heima.xxljob.job;

import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;

@Component
public class HelloJob {

    //在创建任务的时候指定的处理器,可以按照指定的频率进行处理
    @XxlJob("demoJobHandler")    
    public void helloJob(){
        System.out.println("简单任务执行了。。。。");

    }
}

参考链接

扫盲篇-什么是分布式任务调度 - 知乎 (zhihu.com)

深度解析分布式任务调度及实现方案_分布式调度实现-CSDN博客

xxl-job工作原理解析 - 梨花压不压海棠 - 博客园 (cnblogs.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1517877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CVPR2023 | 3D Data Augmentation for Driving Scenes on Camera

3D Data Augmentation for Driving Scenes on Camera 摄像机驾驶场景的 3D 数据增强 摘要翻译 驾驶场景极其多样和复杂&#xff0c;仅靠人力不可能收集到所有情况。虽然数据扩增是丰富训练数据的有效技术&#xff0c;但自动驾驶应用中现有的摄像头数据扩增方法仅限于二维图像…

MySQL order by 语句执行流程

全字段排序 假设这个表的部分定义是这样的&#xff1a; CREATE TABLE t (id int(11) NOT NULL,city varchar(16) NOT NULL,name varchar(16) NOT NULL,age int(11) NOT NULL,addr varchar(128) DEFAULT NULL,PRIMARY KEY (id),KEY city (city) ) ENGINEInnoDB; 有如下 SQL 语…

自动控制原理--matlab/simulink建模与仿真

第一讲 自动控制引论 第二讲 线性系统的数学模型 第三讲 控制系统的复域数学模型(传递函数) 第四讲 控制系统的方框图 /video/BV1L7411a7uL/?p35&spm_id_frompageDriver pandas, csv数据处理 numpy&#xff0c;多维数组的处理 Tensor&#xff0c;PyTorch张量 工作原理图…

留学生课设|R语言|研究方法课设

目录 INSTRUCTIONS Question 1. Understanding Quantitative Research Question 2. Inputting data into Jamovi and creating variables (using the dataset) Question 3. Outliers Question 4. Tests for mean difference Question 5. Correlation Analysis INSTRUCTIO…

Tomcat的使用

1. Tomcat 1.1 Tomcat 是什么 Tomcat 就是基于 Java 实现的一个开源免费, 也是被广泛使用的 HTTP 服务器 1.2 下载安装 Tomcat官网选择其中的 zip 压缩包, 下载后解压缩即可&#xff0c;解压缩的目录最好不要带 “中文” 或者 特殊符号 进入 webapps 目录,每个文件夹都对应…

graylog API 弱密码

graylog web 页面密码设置 输入密码&#xff1a;获取sha256加密后密码 echo -n "Enter Password: " && head -1 </dev/stdin | tr -d \n | sha256sum | cut -d" " -f1vi /etc/graylog/server/server.conf #修改以下配置 root_usernameroot ro…

Monorepo 解决方案 — 基于 Bazel 的 Xcode 性能优化实践

背景介绍 书接上回《Monorepo 解决方案 — Bazel 在头条 iOS 的实践》&#xff0c;在头条工程切换至 Bazel 构建系统后&#xff0c;为了支持用户使用 Xcode 开发的习惯&#xff0c;我们使用了开源项目 Tulsi 作为生成工具&#xff0c;用于将 Bazel 工程转换为 Xcode 工程。但是…

【爬虫开发】爬虫从0到1全知识md笔记第1篇:爬虫概述【附代码文档】

爬虫开发从0到1全知识教程完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;爬虫概述。selenium的其它使用方法。Selenium课程概要。常见的反爬手段和解决思路。验证码处理。chrome浏览器使用方法介绍。JS的解析。Mongodb的介绍和安装,小结。mongodb的简单使…

信息系统项目管理师--干系人管理

干系人会受到项⽬积极或消极的影响&#xff0c;或者能对项⽬施加积极或消极的影响 项⽬经理和团队管理⼲系⼈的能⼒决定着项⽬的成败。为提⾼项⽬成功的概率&#xff0c; 尽早开始识别⼲系⼈并引导⼲系⼈参与。当项⽬章程被批准、项⽬经理被委任&#xff0c;以及团队开始组建之…

【剪枝实战】使用VGGNet训练、稀疏训练、剪枝、微调等,剪枝出只有3M的模型

摘要 本次剪枝实战是基于下面这篇论文去复现的&#xff0c;主要是实现对BN层的γ/gamma进行剪枝操作&#xff0c;本文用到的代码和数据集都可以在我的资源中免费下载到。 相关论文&#xff1a;Learning Efficient Convolutional Networks through Network Slimming (ICCV 2017…

算法---滑动窗口练习-3(水果成篮)

水果成篮 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;水果成篮 2. 讲解算法原理 算法的主要思想是使用滑动窗口来维护一个包含最多两种水果的子数组。定义两个指针 left 和 right 分别表示窗口的左边界和右边界。还定义了一个数组 hash 来记录水…

【新书推荐】29.1 32位汇编基本概念

第二十九章 32处理器体系结构 这一章我们将讲述32处理器体系结构。包括32位计算机的一些基本概念&#xff0c;32位处理器&#xff0c;程序加载执行的过程&#xff0c;32位计算机的硬件组成和输入输出系统。 29.1 基本概念 本节内容&#xff1a; ■实模式与保护模式 ■操作系…

Css提高——flex布局及其相关属性

目录&#xff1a; 1、传统布局与flex布局的区别 2、flex的布局原理 3、flex常见的父项属性 3.1、flex-direction &#xff1a;设置主轴的方向 3.2、justify-content 设置主轴上的子元素排列方式 3.3、flex-wrap 设置子元素是否换行 3.4、align-items 设置侧轴上的子元素排…

北京保险服务中心携手镜舟科技,助推新能源车险市场规范化

2022 年&#xff0c;一辆新能源汽车在泥泞的小路上不慎拖底&#xff0c;动力电池底壳受损&#xff0c;电池电量低。车主向保险公司报案&#xff0c;希望能够得到赔偿。然而&#xff0c;在定损过程中&#xff0c;保司发现这辆车的电池故障并非由拖底事件引起&#xff0c;而是由于…

融入Facebook的世界:探索数字化社交的魅力

融入Facebook的世界&#xff0c;是一场数字化社交的奇妙之旅。在这个广袤的虚拟社交空间中&#xff0c;人们可以尽情展现自己、分享生活&#xff0c;与全球朋友、家人和同事保持紧密联系&#xff0c;共同探索社交互动的乐趣与魅力。让我们深入了解这个世界的魅力所在&#xff1…

Docker 安装部署MySQL教程

前言 Docker安装MySQL镜像以及启动容器&#xff0c;大致都是三步&#xff1a;查询镜像–>拉取镜像–>启动容器 1、查询镜像 docker search mysql2、拉取镜像 拉取镜像时选择stars值较高的 docker pull mysql:5.7 #这里指定拉取对应的版本Mysql5.7&#xff0c;没有指…

冒泡排序,详详解解

目录 基本概念&#xff1a; 上图&#xff1a; 核心思路&#xff1a; 基本步骤&#xff1a; 关键&#xff1a; 代码核心&#xff1a; 补充&#xff1a; 代码&#xff08;规范&#xff09; &#xff1a; 代码&#xff08;优化&#xff09;&#xff1a; 今天我们不刷力扣了&…

Docker出现容器名称重复如何解决

假如你的重复容器名称是mysql5 删除已存在的容器&#xff1a;如果你不再需要那个已经存在的名为“mysql5”的容器&#xff0c;你可以删除它。使用下面的命令&#xff1a; docker rm -f mysql5这条命令会强制删除正在运行的容器。一旦容器被删除&#xff0c;你就可以重新使用这个…

计算数据集的几何平均数geometric_mean

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算数据集的几何平均数 geometric_mean [太阳]选择题 geometric_mean的作用是&#xff1f; import statistics a [1, 2, 3, 4] average_a statistics.geometric_mean(a) print(average_a)…

软考高级:遗留系统演化策略(集成、淘汰、改造、继承)概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…