分布式任务调度的架构与选型

场景

任务调度是指系统在约定的特定时刻自动去执行指定任务的过程。 比如:

  • 某新闻App每天上午10点给用户推送最新新闻。
  • 某电商系统需要在每天上午 10 点,下午 3 点,晚上 8 点等不同适合发放一批优惠券。
  • 某银行系统需要在信用卡到期还款日的前三天每天进行短信提醒。
  • 某财务系统需要在每天凌晨 1点 结算前一天的财务数据,统计汇总。
  • 某报表系统需要在每天凌晨 1点 读取业务数据生成报表数据。
  • 12306 会根据车次的不同,而设置某几个时间点进行分批放票。

功能

一个任务调度平台,需要具备有以下几点功能:

  • 核心功能:定时调度、任务管理、日志监控
  • 高可用:集群、分片、失败处理
  • 高性能:分布式锁
  • 扩展功能:可视化运维、多语言、任务编排

架构

以 XXL-JOB 和 Elastic-job 说明分布式任务调度的一些基本工作原理。

1. XXL-JOB

以下内容参考自:xxl-job官网

xxl job 的架构原理

XXL-JOB 是一个轻量级分布式任务调度平台,其设计理念主要是为了简化分布式系统中定时任务的管理和执行。 XXL-JOB 的架构提供了高效的任务调度能力,支持任务的分布式执行,以及故障转移和动态扩展的能力。

1.1 核心组件
  1. 调度中心

    • 调度中心是 XXL-JOB 的核心部分,负责管理任务的注册、存储、调度和监控。它提供了一个用户界面,用于配置和管理任务的执行。
    • 调度中心还负责触发执行器运行相应的任务,并处理执行结果。
  2. 执行器

    • 执行器是任务执行的工作节点。在实际部署时,可以在不同的机器上部署多个执行器实例,以实现任务的分布式执行。
    • 执行器从调度中心接收执行命令,执行具体的任务,并将执行结果反馈给调度中心。
1.2 架构原理
  1. 任务调度流程

    • 用户在调度中心定义任务,包括任务的执行脚本、调度策略(如CRON表达式)、失败处理策略等。
    • 调度中心根据任务配置的时间策略(如CRON表达式),触发任务的执行。
    • 当任务触发时,调度中心选择一个或多个执行器发送执行命令。
    • 执行器接收到执行命令后,开始执行具体的任务逻辑,并将执行结果返回给调度中心。
    • 调度中心接收执行结果,并进行相应的处理,如重试、告警等。
  2. 负载均衡与故障转移

    • XXL-JOB 支持自动记录每个执行器的负载情况,调度中心会根据这些信息智能选择负载较低的执行器执行任务,实现负载均衡。
    • 在执行器出现故障时,调度中心可以自动将任务转移到其他健康的执行器上,实现故障转移。
  3. 动态扩展

    • 执行器支持水平扩展。当任务量增加,导致现有执行器负载过高时,可以简单地增加更多的执行器实例,调度中心会自动识别并利用新增的执行器资源。
  4. 高可用性设计

    • XXL-JOB 调度中心通常部署为集群模式,以避免单点故障。通过数据库共享任务配置和执行记录,任何一个调度中心实例都能处理任务调度和管理。
  5. 运行模式

    • Bean模式:每个Bean模式任务都是一个Spring的Bean类实例,它被维护在“执行器”项目的Spring容器中。任务类需要加“@JobHandler(value=”名称”)”注解,因为“执行器”会根据该注解识别Spring容器中的任务。任务类需要继承统一接口“IJobHandler”,任务逻辑在execute方法中开发,因为“执行器”在接收到调度中心的调度请求时,将会调用“IJobHandler”的execute方法,执行任务逻辑。

    • GLUE模式(Java):每个 “GLUE模式(Java)” 任务的代码,实际上是“一个继承自“IJobHandler”的实现类的类代码”,“执行器”接收到“调度中心”的调度请求时,会通过Groovy类加载器加载此代码&

### 分布式任务调度系统的架构图概述 分布式任务调度系统的核心在于合理分配计算资源并协调多个节点之间的任务执行过程。以下是关于此类系统的一个典型架构描述: #### 1. **架构组成** 典型的分布式任务调度系统由以下几个主要模块构成[^1]: - **调度中心**: 负责接收任务请求,根据预定义的规则或算法决定哪个工作节点来运行该任务。 - **工作节点 (Worker)**: 执行实际的任务逻辑。它们会向调度中心报告自身的状态以及已完成的工作情况。 - **存储层**: 提供持久化支持,用于保存任务配置、历史记录以及其他元数据信息。 #### 2. **通信机制** 各组成部分之间通常采用消息队列或者RPC方式进行交互[^2]。例如: - 使用Kafka作为事件驱动的消息中间件传递指令; - 或者利用gRPC实现低延迟的服务调用接口。 #### 3. **高可用性和容错处理** 为了提高整个系统的稳定性和可靠性,在设计时还需要考虑以下方面[^3]: - 数据复制备份策略以防止单点失效; - 动态扩展能力使得可以灵活应对负载变化的需求; 下面给出了一种可能的简化版架构示意代码表示形式(伪代码),帮助理解其结构关系: ```java // 定义一个简单的作业类 public abstract class BaseJob { protected String jobId; public abstract void execute(); } // 实现具体的某个job public class MyCustomJob extends BaseJob{ @Override public void execute(){ System.out.println("Executing custom job with id:" + this.jobId); } } // 创建scheduler服务端入口程序 public class SchedulerServer { private Map<String, List<WorkerNode>> workerPool; public void start() throws Exception{ while(true){ // 获取待处理的新task Task newTask = getNewTaskFromQueue(); // 查找合适的worker node去跑这个task WorkerNode selectedWorker = selectBestAvailableWorker(newTask); if(selectedWorker != null){ sendTaskToWorker(newTask,selectedWorker); }else{ logError("No available workers found!"); } Thread.sleep(intervalBetweenPolling); } } } ``` 以上仅为概念性的展示,并未涉及具体技术选型细节。实际应用中的方案可能会更加复杂多样。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ArchManual

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值