XXL-JOB基础及面经

一、概述

XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

二、架构设计

1.设计思想

将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。

将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑。

因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性;

2.系统组成
  • 调度模块(调度中心)
    负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;
    支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover。
  • 执行模块(执行器)
    负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效;
    接收“调度中心”的执行请求、终止请求和日志请求等。
3.架构图

image-20240331170401113

4.任务执行流程

image-20240331195254230

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

单体系统 中有许多实现 任务调度 的方式,如多线程方式、Timer 类、Spring Tasks 等等。这里比较常用的是 Spring Tasks(通过 @EnableScheduling + @Scheduled 的注解可以自定义定时任务,有兴趣的可以去了解一下)

分布式下,每个服务都可以搭建为集群,这样的好处是可以将任务切片分给每一个服务从而实现并行执行,提高任务调度的处理效率。那么为什么 分布式系统 不能使用 单体系统 的任务调度实现方式呢。

在集群服务下,如果还是使用每台机器按照单体系统的任务调度实现方式实现的话,会出现下面这四个问题:

  1. 怎么做到对任务的控制(如何避免任务重复执行)。
  2. 如果某台机器宕机了,会不会存在任务丢失。
  3. 如果要增加服务实例,怎么做到弹性扩容。
  4. 如何做到对任务调度的执行情况统一监测。

通过上面的问题可以了解到分布式系统下需要一个满足高可用、容错管理、负载均衡等功能的任务调度平台来实现任务调度。分布式系统下,也有许多可以实现任务调度的第三方的分布式任务调度系统,如 xxl-job、Quartz、elastic-job 等等常用的分布式任务调度系统。

三、学成在线项目XXL-JOB实战

当前项目需要对上传到分布式文件系统 minio 中的视频文件进行统一格式的视频转码操作,由于本身视频转码操作会带了很大的时间消耗以及 CPU 的开销,所以考虑集群服务下使用 xxl-job 的方式以任务调度的方式定时处理视频转码操作。

这样可以带来两个好处:① 以任务调度的方式,可以使得视频转码操作不会阻塞主线程,避免影响主要业务的吞吐量; ② 以集群服务分片接收任务的方式,可以将任务均分给每个机器使得任务调度可以并行执行,提高总任务处理时间以及降低单台机器 CPU 的开销;

本项目使用XXL-JOB完成课程发布数据同步、支付结果通知等任务。

下边以视频处理任务为例说明:
1.调度中心采用分片广播方式下发任务

执行器部署在多个微服务实例,收到任务从数据库读取待处理任务列表:

img

每个执行器收到广播任务有两个参数:分片总数、分片序号。每个执行器从数据表取任务时可以让任务id 模上 分片总数,如果等于分片序号则执行此任务。

上边两个执行器实例的分片总数为2,序号为0、1,从任务1开始,如下:

1 % 2 = 1 执行器2执行

2 % 2 = 0 执行器1执行

3 % 2 = 1 执行器2执行

2.得到待处理任务启动多任务进行任务处理

下图是视频上传及处理的业务流程:

img

上传视频成功向视频处理待处理表添加记录

由于调度中心进行任务调度,执行器从数据库查询待处理任务,启动多线程进行处理。

四、面经

1.XXL-Job的核心组件是什么?
  • Admin: 任务管理后台,用于配置和管理任务。
  • Executor: 任务执行器,用于执行任务。可以有多个Executor节点,实现任务的分布式执行。
  • JobCore: 任务核心配置,包括任务的执行时间、执行器、调度策略等。
  • JobHandler: 任务处理器,实际执行任务的逻辑。
2.XXL-Job的任务调度原理是什么?

XXL-Job使用分布式调度策略来实现任务调度。任务在Admin配置后,被分配给Executor节点,Executor节点根据任务的调度策略和执行时间来执行任务。XXL-Job使用数据库来存储任务信息和执行日志,确保任务的可靠性和可恢复性。

3.XXL-Job的任务如何进行分片处理?

XXL-Job支持分片任务,任务执行时可以按照分片数量进行并行处理。开发人员需要实现分片任务的逻辑,并在任务处理器(JobHandler)中指定分片参数。Executor节点会根据分片参数来划分任务,并并行执行。

4.XXL-Job的任务监控和报警如何实现?

XL-Job提供了任务监控和报警功能。管理员可以在Admin后台配置任务的报警规则,当任务执行异常或超时时,系统会触发报警。XXL-Job还提供了任务执行日志和统计信息,方便用户监控任务的执行情况。

5.XXL-Job支持哪些任务执行方式?

Bean模式: 任务处理器是一个Spring Bean,可以通过Spring的方式来管理和注入依赖。
Script模式: 任务处理器可以是一个脚本文件,支持Shell脚本、Python脚本等。
Glue模式: 任务处理器可以是一个Glue类型的Java类文件,可以在任务配置中指定类名和方法名。

原文链接:https://blog.csdn.net/koushen001/article/details/133636244

6.XXL-Job的定时任务和周期性任务有何区别?

定时任务是指任务在指定的时间点执行一次,而周期性任务是指任务按照固定的时间间隔反复执行。XXL-Job支持配置定时任务和周期性任务,用户可以根据实际需求选择合适的任务类型。

7.XXL-Job如何保证任务的高可用性?
  • 支持多个Executor节点,实现任务的分布式执行,一台Executor节点故障不会影响整个系统。
  • 支持任务的故障转移,如果某个Executor节点故障,任务可以自动切换到其他可用节点执行。
  • 使用数据库来存储任务信息和执行日志,确保任务的可恢复性。
8.XXL-Job的安全性如何保障?

XXL-Job提供了安全控制功能,可以配置用户权限和任务权限。管理员可以为不同的用户分配不同的角色和权限,确保只有授权的用户可以访问任务管理后台和执行任务。

9.XXL-Job的扩展性如何?

XXL-Job提供了丰富的扩展点和插件机制,用户可以根据需要自定义任务执行逻辑、任务调度策略、报警方式等。这使得XXL-Job具有很强的扩展性,可以满足各种复杂的任务调度需求。

10.XXL-Job的任务执行失败了,如何排查和处理?

如果XXL-Job的任务执行失败,可以采取以下步骤进行排查和处理:

  • 查看任务执行日志,了解失败原因和异常信息。

  • 检查任务处理器(JobHandler)的实现,确保代码逻辑正确。

  • 检查任务的调度策略和参数配置,是否合理。

  • 查看Executor节点的日志,检查Executor是否正常运行。

  • 如果任务执行超时,可以适当调整任务的超时时间。

  • 如果任务执行异常,可以考虑增加报警规则,及时发现和处理异常任务。

11.XXL-Job如何处理分片任务的失败和重试?

XXL-Job对分片任务的失败和重试提供了支持。如果分片任务的某个分片执行失败,XXL-Job会自动进行重试,直到达到最大重试次数或任务成功执行为止。开发人员可以配置分片任务的最大重试次数和重试策略。

12.XXL-Job的任务调度器是如何实现的?

XXL-Job的任务调度器基于Quartz Scheduler实现。Quartz是一个开源的任务调度框架,提供了丰富的调度功能,XXL-Job在其基础上进行了定制化的扩展。

发人员可以配置分片任务的最大重试次数和重试策略。

12.XXL-Job的任务调度器是如何实现的?

XXL-Job的任务调度器基于Quartz Scheduler实现。Quartz是一个开源的任务调度框架,提供了丰富的调度功能,XXL-Job在其基础上进行了定制化的扩展。

侵权请及时联系删文

GitHub 加速计划 / xx / xxl-job
27.15 K
10.79 K
下载
xxl-job: 是一个分布式任务调度平台,核心设计目标是开发迅速、学习简单、轻量级、易扩展。
最近提交(Master分支:3 个月前 )
e5d26ba2 - 3 个月前
977ad87b - 3 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐