支持多租户,零延迟的 Cron-Job 分布式任务调度平台 v1.0.7 正式发布(XXL-JOB迎来强势挑战者)

市面上主流的分布式任务调度平台有很多,其中,比较火爆的是XXL-JOB、Elastic-Job这两款,现在,又迎来了第三款 Cron-Job 分布式任务调度平台。根据Cron-Job官方介绍,相比XXL-JOB等产品,Cron-Job额外支持多租户级别的权限管理功能,这个特点在企业应用中还是比较实用的。而且,支持超低延迟,甚至零延迟的调度策略,可以确保任务执行的及时性。

为什么需要分布式任务调度平台?

有一个场景,需要每天凌晨1点执行一次统计任务,一般情况下是使用分布式锁(Redis、ZK、MySQL)等方式,保证同一时刻只有一个任务执行。整个应用中如果有多个这类任务则需要重复维护,如果扩大到整个公司的业务来看,效率将是低下的,并且以下诉求很难得到满足:

  • 不支持任务参数的动态调整,例如某类任务需要根据特定参数做一些特性化事情的时候。
  • 不支持分片任务,例如某类任务需要处理的数据量很大,需要分片处理,多个系统之间的协调也是难点。
  • 较难失败重试,或失效转移,例如执行失败之后,需要重试或转移到其他节点执行。
  • 任务执行数据难以统计,任务的执行的耗时、失败次数、执行次数等,都难以统计。
  • 不支持任务的停止,例如在机房迁移等一些场景,需要暂时性的停止任务。
  • 但是 Cron-Job 可以很好的解决这些问题,并且接入简单、超低延迟、可靠性高,使用起来非常方便。

管理平台界面

支持多租户,零延迟的 Cron-Job 分布式任务调度平台 v1.0.7 正式发布(XXL-JOB迎来强势挑战者)插图

支持多租户,零延迟的 Cron-Job 分布式任务调度平台 v1.0.7 正式发布(XXL-JOB迎来强势挑战者)插图1

什么是Cron-Job?

Cron-Job 分布式任务调度平台是一种用于管理微服务系统中定时任务的软件系统,它提供了一种简单易用、超低延迟、支持用户权限管理、多语言客户端和多租户接入的方式来高效调度和执行任务。

1. 技术栈

Cron-Job 分布式任务调度平台是前后端分离的架构,服务端基于Java语言开发,前端基于Ant Design Pro开发,采用互联网主流技术栈构建而成。涉及的主要技术栈有:

  • 服务端:MySQL、Druid、MyBatis、MyBatis-Generator、HttpClient、Spring Boot等。
  • 前端:React、Ant Design Pro、Ant Design Charts、Babel、Eslint、Axios等。

2. 基本概念

  • 租户:租户是指系统中不同的业务方,每个租户在cron-job中拥有独立的权限管理和资源隔离。
  • 调度器:调度器是指系统中负责任务调度的服务,它可以根据任务的配置信息,在指定的时间点派发任务给执行器。
  • 应用:应用是接入方的一个微服务,它受调度器的调度,一个应用下一般有多个实例。
  • 执行器:执行器是应用的一个实例,负责执行任务的具体逻辑,一个应用下一般有多个执行器。
  • 任务:任务是指系统中最小的执行单元,它可以通过配置在某个特定的时间点触发任务执行。
  • 任务日志:任务日志是指系统中某一次任务的执行日志,他涵盖了这个任务派发给了哪个执行器,什么时候执行的,耗费了多少时间等等信息。

Cron-Job的核心优势

1. 简单易用

  • 部署简单、接入简单,只需要简单几步,即可轻松地将应用接入到 Cron-Job 分布式任务调度平台。
  • 支持任何Cron表达式的任务调度,支持常用的分片和随机策略;支持失败丢弃、失败重试的失败策略;支持动态任务参数。

2. 毫秒级的调度延迟

  • 基于提前调度策略,抹平服务器时间差、网络延迟等因素,使任务的执行更加及时,实际测试为个位数毫秒级别(执行器的GC和性能)。
  • 基于ACK确认、失败重试、过期调度等策略,使任务的执行更加准确、可靠,当然也可以通过配置不要失败重试。

3. 多租户支持

对于多业务线的企业,只需要部署一套任务调度平台,即可支撑多业务接入,且业务线权限之间互不干扰。

4. 用户体验与效率

  • 用户的接入更加简单,只需要代码上打上注解,就可以完成自动注册,不需要额外的配置,只需要点击开始即可。
  • 管理后台UI更加精美简洁,并优化了管理后台的交互逻辑,理解和使用更加简单。
  • 更加全面且有结构化的官方文档,尽可能让用户一目了然,自主接入和部署。

5. 增强横向扩展能力

  • 多租户的接入能力,只需要部署一套调度平台,即可接入公司内所有业务线。
  • 横向扩展的能力,支持集群多节点部署,即可支持更大的并发量和任务量。

6. 更安全的管理后台

  • 精心设计权限管理的功能,可控制到接口的权限级别,任务的安全性更加可靠,多租户间权限隔离。
  • 后台管理接口的交互、执行器和调度器之间的OpenApi交互,均采用签名校验机制,避免参数篡改、伪造和重放等问题。

7. 更高效的问题排查效率

管理后台提供更多维度的日志详情,能够帮助用户更好的理解任务的执行情况,并且能够更好的排查问题。

Cron-Job的架构

1. 模块架构

支持多租户,零延迟的 Cron-Job 分布式任务调度平台 v1.0.7 正式发布(XXL-JOB迎来强势挑战者)插图2

2. 部署架构

支持多租户,零延迟的 Cron-Job 分布式任务调度平台 v1.0.7 正式发布(XXL-JOB迎来强势挑战者)插图3

原生Java接入

点击查看对接代码

1. 引入maven依赖

<!--
同时提供有Gradle等各类依赖类型 
https://mvnrepository.com/artifact/cn.horace.cronjob/cronjob-executor 
-->
<dependency>
    <groupId>cn.horace.cronjob</groupId>
    <artifactId>cronjob-executor</artifactId>
    <version>最新版本</version>
</dependency>

2. 实现任务处理接口

/**
 * 演示任务
 * Created in 2025-01-01 10:44.
 *
 * @author Horace
 */
@TaskConfig(name = "普通测试任务", cron = "* * * * * ? ", routerStrategy = RouterStrategy.RANDOM)
public class DemoCronTask implements TaskHandler {
    private static final Logger logger = LoggerFactory.getLogger(DemoCronTask.class);
    /**
     * 执行任务的方法
     *
     * @param params 任务参数
     * @return 任务执行结果,如果执行成功,则返回HandlerResult.success(),如果执行失败,则返回HandlerResult.fail(),返回null,也判定是失败
     */
    @Override
    public HandlerResult handle(TaskParams params) {
        logger.info("task handler..., params:{}", params);
        Random random = new Random();
        int delay = random.nextInt(50);
        LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(delay));
        return HandlerResult.success();
    }
}

3. 新建启动类

/**
 * 示例执行器
 * <p>
 *  * @author Horace
 */
public class ExampleExecutor {
    private static final Logger logger = LoggerFactory.getLogger(ExampleExecutor.class);
    public static void main(String[] args) {
        ArrayList<Object> taskObjects = new ArrayList<>();
        taskObjects.add(new DemoCronTask());
        
        ExecutorConfig config = ExecutorConfig.Builder.newBuilder(taskObjects)
                .address("http://127.0.0.1:9527")
                .tenant("horace")
                .appName("example-executor")
                .appDesc("普通示例执行器")
                .tag("common")
                .signKey("7d890a079948b196756rtf5452d2245t")
                .build();
        CronJobExecutorClient.init(config).start();
    }
}
  • address:这里指定的是调度器的地址,如果是本地单节点测试,则指定地址+端口的方式是;如果是线上集群部署,则指定的是Nginx地址。
  • tenant:租户的代码,一般是租户的英文名称。
  • appName:应用名称,一般是应用的英文名称。
  • appDesc:应用描述,应用的中文描述,后续在管理平台中可以看到。
  • tag:标签,用于区分同个应用下的不同执行器,如无需求,则不配置即可。
  • signKey:签名密钥,用于验证执行器的身份,必须和调度器配置的签名密钥一致。

SprintBoot版本接入

点击查看对接代码

1. 引入maven依赖

<!--
同时提供有Gradle等各类依赖类型 
https://mvnrepository.com/artifact/cn.horace.cronjob/cronjob-executor-starter 
-->
<dependency>
    <groupId>cn.horace.cronjob</groupId>
    <artifactId>cronjob-executor-starter</artifactId>
    <version>最新版本</version>
</dependency>

2. 实现任务处理接口

/**
 * 演示任务
 *
 * @author Horace
 */
@Component
@TaskConfig(name = "Spring测试任务", cron = "* * * * * ? ", routerStrategy = RouterStrategy.RANDOM)
public class DemoCronTask implements TaskHandler {
    private static final Logger logger = LoggerFactory.getLogger(DemoCronTask.class);

    /**
     * 执行任务的方法
     *
     * @param params 任务参数
     * @return 任务执行结果,如果执行成功,则返回HandlerResult.success(),如果执行失败,则返回HandlerResult.fail(),返回null,也判定是失败
     */
    @Override
    public HandlerResult handle(TaskParams params) {
        logger.info("task handler..., params:{}", params);
        Random random = new Random();
        int delay = random.nextInt(200);
        LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(delay));
        return HandlerResult.success();
    }
}

注意:这里的任务类一定要打上Spring的注解,可以是@Component,把对象实例交给Spring管理。

3. 新建配置类

/**
 * Created in 2025-01-01 21:00.
 *
 * @author Horace
 */
@Configuration
public class AppConfig {
    private static final Logger logger = LoggerFactory.getLogger(AppConfig.class);

    /**
     * 自定义配置
     *
     * @return
     */
    @Bean
    public ExecutorStarterConfig cronJobExecutorStarterConfig() {
        ExecutorStarterConfig config = new ExecutorStarterConfig();
        config.setAddress("http://127.0.0.1:9527");
        config.setTenant("horace");
        config.setAppName("example-executor-starter");
        config.setAppDesc("Spring示例执行器");
        config.setTag("common");
        config.setSignKey("7d890a079948b196756rtf5452d2245t");
        return config;
    }
}

4. 新建启动类

/**
 * Created in 2025-01-01 21:00.
 *
 * @author Horace
 */
@EnableCronJob
@SpringBootApplication
public class ExampleSpringExecutor {
    private static final Logger logger = LoggerFactory.getLogger(ExampleSpringExecutor.class);

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

注意:需要在启动类上加上@EnableCronJob注解,开启CronJob的自动配置。

更新日志

【优化】告警方法放入线程池中执行
【优化】请求签名去除无用字段,减少请求参数大小

【优化】优化管理后台页面展示
【优化】任务日志详情页面增加执行器主机名字段。
【BugFix】修复调度大盘中数据指标的任务选择名称取错的问题。
【新增】大盘展示告警概要列表,可点击查看告警详情。
【新增】增加任务失败告警能力,并对接飞书、Lark。

下载地址

下载说明:① 请不要相信网站的任何广告;② 当你使用手机访问网盘时,网盘会诱导你下载他们的APP,大家不要去下载,直接把浏览器改成“电脑模式/PC模式”访问,然后免费普通下载即可;③ 123云盘限制,必须登录后才能下载,且限制每人每天下载流量1GB,下载 123云盘免流量破解工具

版权声明:
小编:吾乐吧软件站
链接:https://wuleba.com/147.html
来源:吾乐吧软件站
本站资源仅供个人学习交流,请于下载后 24 小时内删除,不允许用于商业用途,否则法律问题自行承担。

THE END
分享
二维码
打赏
< <上一篇
下一篇>>
文章目录
关闭
目 录