Spring Cloud Alibaba 集成分布式定时任务调度功能

news2024/11/28 16:33:03

作者:千习

背景简介

定时任务是指在约定的时间,或者按照固定频率周期性执行的任务。在企业应用中,非用户行为发起的后台业务,一般都是通过定时任务来实现,常见场景如下:

  • 异步数据处理:比如先将订单入库,每分钟扫描未支付的订单做批处理。
  • 自动化运维:比如每小时清理一次数据库的历史记录。
  • 系统监控:比如每分钟扫描监控指标,如果超出阈值,进行报警。
  • 数据同步:比如每天凌晨 1 点把 mysql 中的数据同步到大数据平台中。

在单体应用中,实现定时任务很简单,比如 Java 中有 java.util.Timer 和 ScheduledExecutorService。在 Spring 框架中也提供了 scheduling 方便的开发定时任务。但是在微服务中,一个应用一般来说有很多节点,通过以上实现方式,就会带来一个致命的问题,那就是任务重复执行。

在这里插入图片描述

Spring Cloud Alibaba 发布了 Scheduling 任务调度 [ 1] 模块 [#3732] [ 2] 提供了一套开源、轻量级、高可用的定时任务解决方案,帮助您快速开发微服务体系下的分布式定时任务。

微服务下的分布式任务能力

定时任务功能作为应用开发中重要能力之一,在 Spring Framework [ 3] 中提供了对定时任务支持,在其最基础的使用场景下可方便的通过 @Scheduled 注解轻松的开发出一个定时任务【剖析参考 [ 4] 】;也可以通过扩展集成 Quartz 框架来实现部分分布式能力,但其目前无法方便的通过 spring 的 @Scheduled 注解快速地定义一个任务。框架原生提供的这些能力在单体应用场景下够用,但在微服务分布式集群场景下就显得有些力所不能及了。

因此在 Spring Cloud Alibaba 体系中我们希望提供一个模块能力,能在微服务场景下快速接入使用分布式定时任务能力。分布式定时任务应该具备哪些能力特性,参考如下对比。

在这里插入图片描述

在微服务分布式场景中,除了基础的定时任务运行能力,还需提供如:防重复执行、分片运行、任务执行并行度控制等能力,后续还可在此基础上继续探索定时任务对微服务应用服务本身的定时调度支持,欢迎在社区提出需求和建议。

快速接入体验

在新版的 Spring Cloud Alibaba 版本中提供分布式任务调度快速启动模块 spring-cloud-starter-alibaba-schedulerx 来支持各类分布式定时任务方案集成。对于采用了 Spring Cloud Alibaba 的微服务应用可以通过添加如下 pom 依赖完成接入。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-schedulerx</artifactId>
    <version>{version}</version>
</dependency>

在应用配置文件提供了 spring.cloud.scheduling.distributed-mode 参数让用户选择采用哪一种实现方案,目前提供了基于“阿里云 schedulerx”和“开源 shedlock”两种模式。后续可根据社区用户需求继续增加其他方案的接入。更为具体详细的接入说明可参考:Example 示例工程 [ 5]

采用阿里云 SchedulerX

接入 Spring 分布式定时任务,最简单的方式就是直接接入阿里云托管的分布式任务调度平台 SchedulerX [ 6] ,不但完全兼容 Spring @Scheduled 注解,还具有高可用、高安全、高性能、免运维、低成本等特点。

任务调度平台 SchedulerX 的任务管理平台,可以帮助您动态新增、修改、运维定时任务,还有报警监控、历史记录、日志服务、链路追踪等企业级可观测方案,同时还可获得如任务分片执行等增强能力,为应用线上定时任务稳定运行保驾护航。

在这里插入图片描述

接入步骤
  1. 登录 SchedulerX 控制台 [ 7] ,免费开通服务。

  2. 参考接入文档 [ 8] 接入,每个账号拥有 5 个免费任务额度,可先 0 成本试用体验。

在这里插入图片描述

采用本地开源方式

不借助云产品,本地接入方式可以再结合 @SchedulerLock [ 9] 注解来实现分布式定时任务。

@SchedulerLock 注解是一个分布式锁的框架,结合 @Scheduled 注解,可以保证任务同一时间,在多个节点上只会执行一次。该框架支持多种分布式锁的实现,比如 Jdbc、Zookeeper、Redis 等,目前的集成模块中只提供了 Jdbc 的方案,后续会继续新增其他模式来满足用户现有场景架构所需。其原理如下:

在这里插入图片描述

接入步骤

下面以 Mysql 分布式锁为例,演示分布式任务的接入过程,首先需要按本章节开始说明添加 spring-cloud-starter-alibaba-schedulerx 和对应配置参数,除此之外用户还需完成如下配置:

  1. 由于采用 jdbc 作为分布式锁实现,因此还需如下 pom 依赖
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.33</version>
</dependency>
  1. 在 application.properties 文件中添加 jdbc 配置(如果已经添加可以忽略这步)
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class=com.mysql.cj.jdbc.Driver

完成上述配置启动应用后,会在对应数据库中创建一个 shedlock 表用于定时任务的执行同步处理。

应用程序代码及任务示例参考如下:

配置启动类,启用 SchedulingTasks:

@SpringBootApplication
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "3m")
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

创建定时任务:

import org.joda.time.DateTime;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;

@Component
public class SpringJob {

    /**
     * 每5分钟跑一次
     */
    @Scheduled(cron = "0 */5 * * * ?")
    @SchedulerLock(name = "SpringJob.job1", lockAtMostFor = "2m", lockAtLeastFor = "1m")
    public void job1() {
        System.out.println("time=" + DateTime.now().toString("YYYY-MM-dd HH:mm:ss") + " do job1...");
    }
    
    /**
     * 每5秒跑一次
     */
    @Scheduled(fixedRate = 5000)
    @SchedulerLock(name = "SpringJob.job2", lockAtMostFor = "4s", lockAtLeastFor = "4s")
    public void job2() {
        System.out.println("time=" + DateTime.now().toString("YYYY-MM-dd HH:mm:ss") + " do job2...");
    }
    
    /**
     * 上次跑完之后隔5秒再跑
     * @throws InterruptedException 
     */
    @Scheduled(fixedDelay = 5000)
    @SchedulerLock(name = "SpringJob.job3", lockAtMostFor = "4s", lockAtLeastFor = "4s")
    public void job3() throws InterruptedException {
        System.out.println("time=" + DateTime.now().toString("YYYY-MM-dd HH:mm:ss") + " do job3...");
        Thread.sleep(10000);
    }
}

未来规划

Spring Cloud Alibaba 分布式定时调度模块为微服务应用场景提供了快速集成接入解决方案,后续可为更多分布式定时任务实现方案提供快速集成,比如:继续集成 quartz/xxljob 等开源组件,且让上述开源组件也都能来适配 spring 的 @Scheduled 注解,实现一份任务代码可对接不同调度服务;同时也会为分布式任务场景下所需的业务能力提供扩展支持。欢迎大家给开源社区 [ 10] 提出关于分布式定时任务的业务功能诉求和建议。

相关链接:

[1] Scheduling 任务调度

https://sca.aliyun.com/docs/2023/user-guide/schedulerx/quick-start/

[2] [#3732]

https://github.com/alibaba/spring-cloud-alibaba/pull/3732

[3] Spring Framework

https://docs.spring.io/spring-framework/docs/5.3.37/reference/html/integration.html#scheduling

[4] 剖析参考

https://developer.aliyun.com/article/1015756

[5] Example 示例工程

https://github.com/alibaba/spring-cloud-alibaba/blob/2023.x/spring-cloud-alibaba-examples/spring-cloud-scheduling-example/README.md

[6] 分布式任务调度平台 SchedulerX

https://www.aliyun.com/ntms/middleware/schedulerx

[7] SchedulerX 控制台

https://schedulerx2.console.aliyun.com/public/AppList

[8] 接入文档

https://help.aliyun.com/zh/schedulerx/user-guide/spring-jobs?spm=5176.14256785.help.dexternal.f09e126dAXAvEs#p-9sy-0ay-hgx

[9] @SchedulerLock

https://github.com/lukas-krecan/ShedLock

[10] 开源社区

https://sca.aliyun.com/

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

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

相关文章

【gpt生成文本的回复的原理和代码,通俗思路清晰】

首先介绍了贪婪解码 其次为增家多样性&#xff0c;用温度系数和TopK增加采样 真实的采样步骤 1、topk备选tokens 2、用维度系数大于1让概率平衡一下&#xff0c;3.再用softmax&#xff0c;4.根据概率分布采样 1、贪婪解码 # 之前&#xff0c;我们总是使用torch.argmax采样最大…

年薪30万+,TOP大厂月薪10万+....网络安全工程师凭什么?

时代飞速发展&#xff0c;我们的工作、生活乃至整个社会的运转都越来越依赖于网络。也因此&#xff0c;网络的无处不在带来了前所未有的安全风险。 从个人隐私泄露到企业机密被盗&#xff0c;再到国家关键基础设施遭受攻击&#xff0c;网络安全问题无处不在&#xff0c;威胁着…

SQL之使用存储过程循环插入数据

1、已经创建了任务日志表 CREATE TABLE t_task_log (id bigint NOT NULL AUTO_INCREMENT,task_id bigint NOT NULL COMMENT 任务ID,read_time bigint NOT NULL COMMENT 单位秒&#xff0c;读取耗时,write_time bigint NOT NULL COMMENT 单位秒&#xff0c;写入耗时,read_size …

8月13日学习笔记 LVS

一.描述以及工作原理 1. 什么是LVS linux virtural server的简称&#xff0c;也就是linxu虚拟机服务器&#xff0c;这是一个 由章文嵩博士发起的开源项目&#xff0c;官网是 http://www.linuxvirtualserver.org,现在lvs已经是linux内核标 准的一部分&#xff0c;使用lvs可以达…

网络剪枝——network-slimming 项目复现

目录 文章目录 目录网络剪枝——network-slimming 项目复现clone 存储库Baselinevgg训练结果 resnet训练结果 densenet训练结果 Sparsityvgg训练结果 resnet训练结果 densenet训练结果 Prunevgg命令结果 resnet命令结果 densenet命令结果 Fine-tunevgg训练结果 resnet训练结果 …

5个小众宝藏软件看看有没有你喜欢的

冷门APP分享来啦&#xff0c;这5个小众宝藏软件看看有没有你喜欢的吧&#xff01; 1.space登月计划 从地球到月球的大概距离是3.84亿米&#xff0c;而登月得消耗掉大约3.2亿千卡的能量。一个人想单飞登月得花上万年。 但在space上&#xff0c;可以和小伙伴一起合作玩登月游戏…

记录Java使用websocket

实现场景&#xff1a;每在小程序中添加一条数据时&#xff0c;后台将主动推送一个标记给PC端&#xff0c;PC端接收到标记将进行自动播放音频。 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import or…

GitHub 2FA中国认证教程

1. 问题描述 在github上有过代码贡献的账号在登录时需要进行2FA双重身份验证。 这是github官方给出的关于2FA的解释&#xff1a; 官方文章地址&#xff1a;点击进入 这是登录时2FA的验证界面&#xff1a; 我们需要使用扩展程序解析这个二维码拿到2FA验证码&#xff0c;填入二维…

python爬虫滑块验证及各种加密函数(基于ddddocr进行的一层封装)

git链接: https://github.com/JOUUUSKA/spider_toolsbox 这里写目录标题 一.识别验证码1、识别英文&#xff0b;数字验证码2、识别滑块验证码3、识别点选验证码 一.识别验证码 git链接: https://github.com/JOUUUSKA/spider_toolsbox 创作不易记得stars 1、识别英文&#xf…

Arduino控制带编码器的直流电机速度

Arduino DC Motor Speed Control with Encoder, Arduino DC Motor Encoder 作者 How to control dc motor with encoder:DC Motor with Encoder Arduino, Circuit Diagram:Driving the Motor with Encoder and Arduino:Control DC motor using Encoder feedback loop: How …

一文读懂Xinstall专属链接推广,轻松解决App运营痛点!

随着互联网的飞速发展&#xff0c;App推广和运营面临着前所未有的挑战。传统的营销方式已经难以适应多变的市场环境&#xff0c;而Xinstall专属链接推广应运而生&#xff0c;成为解决App获客难题的新利器。本文将深入探讨Xinstall专属链接推广如何帮助推广者触达更多用户&#…

MacOS vue-cli为2.9.6 无法升级的解决方案

背景 今天需要验证plop工具做前端工程化实践&#xff0c;打算使用vue3方式&#xff0c;结果发现vue-cli 2.9.6一直无法升级成功&#xff0c;也无法通过vue-cli生成vue3模板工程&#xff0c;测试了几把后&#xff0c;最终升级vue-cli成功&#xff0c;为了能给出现同样问题的小伙…

上瘾模型与产品激励系统

​产品要增加客户粘性&#xff0c;使产品深入人心就需要让用户对产品上瘾。如何使用户对产品上瘾&#xff1f;对于产品来说&#xff0c;就需要建立产品的激励系统。 产品的激励系统要做的事就是对用户进行激励&#xff0c;就是让用户主动完成产品或服务想要他们做的事情。 那么…

重启人生计划-勇敢者先行

&#x1f973;&#x1f973;&#x1f973; 茫茫人海千千万万&#xff0c;感谢这一刻你看到了我的文章&#xff0c;感谢观赏&#xff0c;大家好呀&#xff0c;我是最爱吃鱼罐头&#xff0c;大家可以叫鱼罐头呦~&#x1f973;&#x1f973;&#x1f973; 如果你觉得这个【重启人生…

分布式与微服务详解

1. 单机架构 只有一台机器&#xff0c;这个机器负责所有的工作 &#xff08;这里假定一个电商网站&#xff09; 现在大部分公司的产品都是单机架构 。 2. 分布式架构 一台机器的硬件资源是有限的&#xff0c;服务器处理请求是需要占用硬件资源的&#xff0c;如果业务增长&a…

前端学习笔记-JS篇-01

JS基础Day1-01-必看-基本软件以及准备工作_哔哩哔哩_bilibili JavaScript介绍 是什么 1.JavaScript (是什么?) 是一种运行在客户端(浏览器)的编程语言&#xff0c;实现人机交互效果2.作用(做什么?) 网页特效(监听用户的一些行为让网页作出对应的反馈)表单验证(针对表单…

streampark-使用记录-备忘

1、重新部署的任务会读历史配置&#xff08;包括错误配置&#xff09;&#xff0c;即使点击确认了也无效 解决&#xff1a;复制新的任务&#xff0c;修改ckeckpoint 路径&#xff08;重要&#xff09; 2、任务启动报错&#xff0c;即使后续把脚本改正确或者复制其他脚本过来执…

什么是 Java?

探索 Java&#xff0c;一种多功能且功能强大的编程语言。释放其构建强大应用程序的潜力。 前言 简单来说&#xff0c;Java 是一种用于开发软件应用程序的面向对象设计的编程语言。截至 2019 年&#xff0c;它是世界上最受欢迎的编程语言&#xff0c;尤其是因为它是开源的&#…

MySQL 的 InnoDB 缓冲池里有什么?--InnoDB存储梳理(二)

文章目录 缓冲池的配置介绍一张表 INNODB_BUFFER_POOL_PAGES字段解释 缓冲池的配置 以下配置的意思&#xff0c;缓冲池在内存中的大小为20M&#xff1b;只有1个缓冲池实例&#xff1b;每一块的大小&#xff0c;插入缓冲占的百分比 # InnoDB 缓存池配置 innodb_buffer_pool_si…

Spring Boot 3.x Web单元测试最佳实践

上一篇&#xff1a;Spring Boot 3.x Rest API统一异常处理最佳实践 下一篇&#xff1a;Spring Boot 3.x Filter实战&#xff1a;记录请求日志 Spring Boot为我们提供了非常便捷的web层Rest API单元测试的API&#xff0c;这种开发能力也是小伙伴必须要掌握的。如何对数据库、中…