问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Elastic-Job定时任务详解:失效转移、任务错过机制与幂等机制

创作时间:
作者:
@小白创作中心

Elastic-Job定时任务详解:失效转移、任务错过机制与幂等机制

引用
CSDN
1.
https://m.blog.csdn.net/longool/article/details/140308290

Elastic-Job作为一款分布式任务调度框架,提供了丰富的功能来保证任务的可靠执行。本文将深入讲解Elastic-Job的三个重要功能:失效转移、任务错过机制与幂等机制,并通过具体示例帮助读者理解这些功能的配置和使用方法。

作业配置项

在使用Elastic-Job时,有几个重要的配置属性需要了解:

  • overwrite:本地配置是否可覆盖注册中心配置。默认为false不可覆盖;true代表可覆盖,每次启动作业都以本地配置为准。
  • monitorExecution:监控作业运行时状态,false代表不监控,true代表监控(默认是开启监控的)。
  • failover:是否开启任务执行失效转移,false代表不开启(默认是不开启的),true代表开启。
  • misfire:是否开启错过任务重新执行,false代表不开启,true代表开启(默认是开启的)。

这些配置属性在作业的配置过程中起着关键作用,下面将分别进行详细讲解。

overwrite 配置覆盖

overwrite属性决定了本地配置是否可以覆盖注册中心的配置。当设置为true时,每次启动作业都会将本地配置上传到注册中心并覆盖之前的配置。

示例:设置overwrite=true

private LiteJobConfiguration createJobConfiguration() {
    // 定义作业核心配置
    JobCoreConfiguration coreConfig =
        JobCoreConfiguration.newBuilder("demoSimpleJob", "0 0/5 * * * ?", 4).failover(true).misfire(true).build();
    // 定义 SIMPLE 作业类型配置
    SimpleJobConfiguration jobConfig =
        new SimpleJobConfiguration(coreConfig, myJob.getClass().getCanonicalName());
    // 定义 Lite 作业根配置
    LiteJobConfiguration simpleJobRootConfig =
        LiteJobConfiguration.newBuilder(jobConfig).overwrite(true).monitorExecution(true).build();
    return simpleJobRootConfig;
}

通过上述配置,可以确保每次启动作业时都使用最新的本地配置。

monitorExecution 监控作业运行时状态

monitorExecution属性用于监控作业的运行状态。开启此功能后,可以实时查看作业的执行情况、统计信息和错误信息等。

启用monitorExecution = true的作用和好处包括:

  • 实时监控作业执行情况
  • 统计作业的执行信息
  • 错误信息追踪和排查
  • 提供可视化的监控界面

但是,在每次作业执行时间和间隔时间均非常短的情况下,建议不监控作业运行时状态以提升效率。

值得注意的是,开启monitorExecution = true能实现分布式作业的幂等性,但对短时间内执行的作业性能影响较大,建议关闭并自行实现幂等性。

failover 失效转移

failover属性用于控制是否开启任务执行失效转移。当作业执行过程中服务器宕机时,失效转移允许将该次未完成的任务在另一作业节点上补偿执行。

在一次运行耗时较长且间隔较长的作业场景中,失效转移是提升作业运行实时性的有效手段。但是,对于间隔较短的作业,不建议开启失效转移。

例如,若作业以每小时为间隔执行,每次执行耗时30分钟。当其中一个分片服务器在执行过程中宕机时,失效转移机制会立即在其他可用服务器上补偿执行未完成的任务。

开启失效转移后,即使服务A在执行过程中宕机,服务B也会立即补偿执行服务A的分片任务。

misfire 任务错过机制

misfire属性用于控制是否开启错过任务重新执行。当作业的执行时长超过其运行间隔时,错过任务重执行能够保证作业在完成上次的任务后继续执行逾期的作业。

在一次运行耗时较长且间隔较长的作业场景中,错过任务重执行是提升作业运行实时性的有效手段。但是,对于未见得关注单次作业的实时性的短间隔的作业来说,开启错过任务重执行并无必要。

例如,若作业以每小时为间隔执行,每次执行耗时30分钟。当作业在12:00开始执行但在13:10才执行完毕时,本该由13:00触发的作业则错过了触发时间。开启错过任务重执行功能后,ElasticJob将在上次作业执行完毕后立即触发执行错过的作业。

开启错过任务重新执行后,数据库中的job_execution_logjob_status_trace_log表会记录每次触发的任务及其执行状态。job_execution_log表记录了每次作业的执行历史,而job_status_trace_log表则记录了作业状态变更的痕迹。

事件跟踪

ElasticJob提供了事件追踪功能,可通过事件订阅的方式处理调度过程的重要事件,用于查询、统计和监控。目前提供了基于关系型数据库的事件订阅方式记录事件。

通过配置数据源和事件跟踪配置,可以在数据库中自动生成job_execution_logjob_status_trace_log两张表,记录每次作业的执行历史和状态变更。

@Bean
@Qualifier("dataSource")
public static DataSource getDataSource() throws Exception {
    MysqlDataSource dataSource = new MysqlDataSource();
    dataSource.setUser("root");
    dataSource.setPassword("root");
    dataSource.setURL("jdbc:mysql://localhost:3306/elastic_job?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true");
    return dataSource;
}

@Bean(initMethod = "init")
public JobScheduler jobDemo() throws Exception {
    JobEventConfiguration jobEventRdbConfig = new JobEventRdbConfiguration(dataSource);
    JobScheduler jobScheduler = new JobScheduler(createRegistryCenter(), createJobConfiguration(), jobEventRdbConfig);
    return jobScheduler;
}

通过事件跟踪功能,可以更方便地监控和分析作业的运行情况。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号