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

目录

任务调度

分布式任务调度

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

使用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-adminexecutor:appname: xxl-job-executor-sampleport: 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;@Beanpublic 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.hqwc.cn/news/540092.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

渗透测试实战思路分析

免责声明&#xff1a;文章来源真实渗透测试&#xff0c;已获得授权&#xff0c;且关键信息已经打码处理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人…

状态机高阶讲解-05

887 00:38:03,240 --> 00:38:04,330 在外面 888 00:38:05,130 --> 00:38:06,120 有 889 00:38:06,400 --> 00:38:08,475 请求进来的时候 890 00:38:08,475 --> 00:38:10,550 有消息进来的时候 891 00:38:11,630 --> 00:38:14,000 那么经过我们状态机 892 0…

白话transformer(三):Q K V矩阵代码演示

在前面文章讲解了QKV矩阵的原理&#xff0c;属于比较主观的解释&#xff0c;下面用简单的代码再过一遍加深下印象。 B站视频 白话transformer&#xff08;三&#xff09; 1、生成数据 我们呢就使用一个句子来做一个测试&#xff0c; text1 "我喜欢的水果是橙子和苹果&…

计算机网络——物理层(数据通信基础知识)

计算机网络——物理层&#xff08;1&#xff09; 物理层的基本概念数据通信的基本知识一些专业术语消息和数据信号码元 传输速率的两种表示方法带宽串行传输和并行传输同步传输和异步传输 信道基带信号调制常用编码方式 我们今天进入物理层的学习&#xff0c;如果还没有了解OSI…

爱普生晶振发布RTC模块晶振(压电侠)

爱普生晶振一直以”省&#xff0c;小&#xff0c;精”技术作为资深核心&#xff0c;并且已经建立了一个原始的垂直整合制造模型&#xff0c;可以自己创建独特的核心技术和设备&#xff0c;使用这些作为基地的规划和设计提供独特价值的产品. 世界领先的石英晶体技术精工爱普生公…

Python实现贝叶斯优化器(Bayes_opt)优化极限学习机回归模型(ELMRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 贝叶斯优化器 (BayesianOptimization) 是一种黑盒子优化器&#xff0c;用来寻找最优参数。 贝叶斯优化…

展厅装修主要流程是什么

1、展厅主题 沟通是展厅装修服务的前提&#xff0c;沟通营者对企业的基本情况了解&#xff0c;影响着展厅装修的服务质量&#xff0c;所以说在为参展商提供展厅装修服务时&#xff0c;都要与参展商进行详细的洽谈。 2、现场勘探 展厅装修的首要步骤就是需要先进入展会的场馆&am…

本地项目上传至远程git仓库

如何将本地项目上传至远程git仓库 在某些时候&#xff0c;本地写的小项目需要上传指定的git仓库。 在本地文件中选择要上传的项目文件目录&#xff0c;右键选择 Git Bash Here 初始化git git init关联远程库 git remote add origin https://github.com/xxxx/xxxx.git将文件添…

04- 基于SpringAMQP封装RabbitMQ,消息队列的Work模型和发布订阅模型

SpringAMQP 概述 使用RabbitMQ原生API在代码中设置连接MQ的参数比较繁琐,我们更希望把连接参数写在yml文件中来简化开发 SpringAMQP是基于AMQP协议定义的一套API规范,将RabbitMQ封装成一套模板用来发送和接收消息 AMQP(Advanced Message Queuing Portocol)是用于在应用程序…

2024.3.14jsp(2)

一、实验目的 掌握eclipse开发工具的使用&#xff1b;jsp标记、如指令标记&#xff0c;动作标记&#xff1b;变量和方法的声明&#xff1b;Java程序片&#xff1b; 实验&#xff1a;看电影 源代码watchMovie.jsp <% page language"java" contentType"text…

OSI(Open Systems Interconnection)模型和TCP/IP模型

OSI模型 OSI模型是一个概念模型&#xff0c;由国际标准化组织&#xff08;ISO&#xff09;在1984年提出&#xff0c;用于促进不同系统间的通信互联。OSI模型将网络通信的过程分为七层&#xff0c;每一层都有其特定的功能&#xff0c;从下至上依次是&#xff1a; 物理层&#x…

最详细数据仓库项目实现:从0到1的电商数仓建设(采集部分)

1、数据库和数据仓库的区别&#xff1a; 数据仓库就是data warehouse&#xff0c;数据小卖店&#xff0c;相当于是对数据加工&#xff0c;计算然后对外提供服务&#xff0c;而不是单纯的存储 2、数据流转过程中数据仓库中的数据源部分 数据源部分的数据**不是只同步数据库当…