实用指南:分布式调度问题:定时任务

news/2025/9/30 16:28:03/文章来源:https://www.cnblogs.com/tlnshuju/p/19121391

实用指南:分布式调度问题:定时任务

2025-09-30 16:25  tlnshuju  阅读(0)  评论(0)    收藏  举报

目录

1、问题背景

2、概念

3、应用场景

4、问题与目标

5、核心技术:分布式调度的实现原理

6、主流技术框架

7、Elastic-Job实践示例

7.1 项目初始化与环境准备

7.2 定义与配置作业

7.3 高级特性


1、问题背景

分布式环境带来的挑战:

  • 任务重复执行:最核心的问题。在集群环境下,如果每个节点都同时执行同一个定时任务,会导致业务数据混乱(如重复扣款、重复发信)。

  • 单点故障:如果只让一台机器执行任务,当这台机器宕机,所有定时任务都会中断,系统可靠性无法保证。

  • 负载不均:有的任务很重,单机处理性能不足,需要将任务拆分到多个节点上并行执行。

  • 弹性伸缩:在流量高峰或低谷时,如何动态地增加或减少任务处理节点。

  • 任务监控与管理:如何直观地查看任务执行状态、执行日志、成功/失败情况,以及手动触发、终止任务。

2、概念

简单来说,这是一个在由多台计算机(节点)组成的集群环境中,自动、高效、可靠地执行预定任务(如数据处理、文件清理、报表生成、消息推送等)的技术和管理问题。

  • 分布式: 任务不是在一台机器上运行,而是在一个由多个节点组成的集群中运行。这带来了扩展性、高可用性,但也引入了复杂性。

  • 调度: 核心是“决定在什么时候、由哪个节点、执行哪个任务”的决策过程。这就像一位智能的“总指挥”。

  • 自动任务: 任务无需人工干预,根据预设的规则(如时间点、时间间隔、事件触发)自动执行。常见的任务类型包括:

    • 定时任务: 如每天凌晨2点统计昨日销售额。

    • 周期性任务: 如每5分钟检查一次库存状态。

    • 延时任务: 如用户下单后30分钟未支付,自动取消订单。

    • 工作流任务: 一个任务由多个有依赖关系的子任务按顺序组成,如“数据抽取 -> 数据清洗 -> 数据计算 -> 报表生成”。

3、应用场景

  • 数据仓库与ETL: 每天定时从各个业务数据库抽取数据,经过清洗、转换后加载到数据仓库中。

  • 报表系统: 在数据就绪后,定时生成业务报表、BI看板所需的数据。

  • 金融对账: 每日定时与银行、支付渠道进行对账文件下载和核对。

  • 缓存预热: 在流量低峰期(如凌晨)预先计算热点数据并加载到缓存中,提升白天访问性能。

  • 日志清理与归档: 定期清理应用服务器上的历史日志文件,或将日志归档到廉价存储中。

  • 消息推送: 定时向用户推送活动通知、生日祝福等。

  • 科学计算与仿真: 将大规模计算任务拆分成子任务,分布到集群中并行计算。

4、问题与目标

单机调度(如 Linux Cron)在简单场景下可行,但在分布式环境下会面临巨大挑战:

  • 高可用性与单点故障:

    • 问题: 如果调度器只部署在一台机器上,该机器宕机则整个系统瘫痪。

    • 目标: 调度器本身需要是分布式的,具备主从切换能力,确保7x24小时可用。

    • 资源隔离与熔断:重要任务不应被非重要任务拖垮。考虑使用线程池隔离,或者引入熔断器(如 Hystrix、Resilience4j)防止任务失败导致雪崩效应。

  • 任务重复执行与遗漏:

    • 问题: 在集群中,如果多个调度器实例同时运行,可能因网络或协调问题导致同一个任务被多个节点同时触发,造成数据错乱。反之,也可能因为节点故障导致任务未被触发。

    • 目标: 保证同一任务在同一时间有且仅有一个实例在执行。这是最核心的挑战之一。

  • 弹性扩容与负载均衡:

    • 问题: 任务量激增时,需要能够快速增加计算节点来分担压力。调度器需要感知集群资源,智能地将任务分发到空闲或负载较低的节点上。

    • 目标: 实现高效的负载均衡,最大化利用集群资源,避免某些节点“忙死”,另一些节点“闲死”。

  • 任务依赖与工作流管理:

    • 问题: 复杂业务通常包含多个有顺序依赖的任务。手动配置和管理这些依赖关系极其困难且容易出错。

    • 目标: 调度系统需要支持可视化的工作流设计,能够自动解析依赖,前驱任务成功后才触发后续任务。

  • 容错与故障转移:

    • 问题: 执行任务的节点可能突然宕机,导致任务执行失败。

    • 目标: 调度器需要能检测到任务失败,并自动将其重新分配给其他健康的节点重试。

    • 失败重试机制:任务执行失败后,应有合理的重试策略(如立即重试、间隔重试、指数退避)。大多数框架都支持配置重试次数。

  • 可视化管理与监控:

    • 问题: 在分布式环境下,任务散落在各个节点,难以统一查看执行状态、日志和性能指标。

    • 目标: 提供统一的Web界面,用于管理任务、监控状态、查看日志、告警和统计分析。

    • 日志追溯:任务执行日志必须集中收集(如 ELK/EFK 栈),并关联任务实例 ID,方便出了问题快速定位。

5、核心技术:分布式调度的实现原理

  • 任务协调与选举(核心中的核心)

    • 目的:确保同一时刻,只有一个调度器实例能触发任务。

    • 实现技术

      • 数据库悲观锁:通过数据库的行锁(如 SELECT ... FOR UPDATE)或乐观锁(版本号)来竞争一个“任务锁”。

      • ZooKeeper/Etcd:利用其强一致性和临时节点(Ephemeral Node)特性。成功创建临时节点的客户端成为 Leader,负责调度。其他节点作为 Follower 监听该节点。

      • Redis:利用 SETNX(Set if not exist)命令争抢一个锁键,并设置过期时间防止死锁。

  • 任务分片

    • 目的:将一个大数据量的任务拆分成多个小任务片(Shard),由不同的执行器节点并行处理,极大提升处理能力。

    • 概念:例如,一个需要处理 1000 万条数据的任务,可以分成 10 片,每片处理 100 万条。框架会自动将分片参数(如分片索引、总分片数)传递给执行器。

    • 示例Elastic-Job 和 Apache ShardingSphere 的弹性作业功能在这方面非常强大。

  • 高可用与故障转移

    • 调度器高可用:通过上述的选举机制,当 Leader 调度器宕机后,Follower 会迅速选举出新的 Leader 接管调度工作。

    • 执行器高可用:当某个执行器节点宕机时,调度中心需要能将本应分配给该节点的任务(特别是分片任务)重新分配给健康的节点。

  • 任务生命周期管理

    • 框架需要提供 API 或控制台来对任务进行全方位的管理:添加、暂停、恢复、触发、终止、修改 Cron 表达式等。

6、主流技术框架

  • Quartz Cluster

    • 简介:经典的老牌调度库,其集群模式通过数据库锁实现任务协调。

    • 优点:非常成熟、稳定,与 Spring 集成简单。

    • 缺点:需要自行创建数据库表,缺乏现成的管理界面;分片、故障转移等功能需要自己实现或二次开发;相对“重”。

    • 学习重点quartz.properties 配置(尤其是 org.quartz.jobStore.isClustered=true)、数据库表结构理解。

  • Elastic-Job

    • 简介:当当网开源的分布式调度解决方案,基于 Quartz 并进行了增强,后捐献给 Apache 基金会。

    • 优点:天生的分布式能力,支持分片、故障转移、弹性扩容;提供运维控制台;文档丰富。

    • 缺点:需要依赖 ZooKeeper 作为注册中心。

    • 学习重点:分片策略、作业类型(Simple、Dataflow)、与 ZooKeeper 的交互原理。

  • XXL-Job

    • 简介:国内开源社区非常火爆的轻量级分布式任务调度平台。

    • 优点:开箱即用,拥有功能强大的管理控制台;设计简洁,中心式调度,易于理解和二次开发;支持多种路由策略(轮询、故障转移、分片广播等)。

    • 缺点:调度中心是单点(虽然可以部署多个,但需要做负载均衡和任务隔离),性能瓶颈可能在调度中心。

    • 学习重点执行器 的概念和部署、路由策略、GLUE 模式。

  • PowerJob

    • 简介:新一代分布式任务调度框架,功能强大。

    • 优点:支持 MapReduce -like 分布式任务、工作流(DAG)、无限任务链;性能强劲。

    • 学习重点:工作流设计、处理器概念。

  • Spring Scheduler + 自定义分布式锁

    • 简介:对于简单的场景,可以使用 @Scheduled 注解,同时使用 Redis 或 Zookeeper 的客户端实现一个分布式锁,在任务执行前先获取锁。

    • 优点:轻量、灵活,与 Spring 生态无缝集成。

    • 缺点:功能简单,需要自己处理所有分布式场景的复杂性(如故障转移、分片),不适合复杂业务。

    • 示例

@Scheduled(cron = "0 */1 * * * ?")
public void scheduledTask() {// 尝试从Redis获取锁,设置过期时间防止死锁String lockKey = "scheduledTaskLock";Boolean success = redisTemplate.opsForValue().setIfAbsent(lockKey, "locked", Duration.ofMinutes(5));if (Boolean.TRUE.equals(success)) {try {// 获取锁成功,执行任务doBusiness();} finally {// 释放锁redisTemplate.delete(lockKey);}} else {// 获取锁失败,说明其他实例正在执行此任务log.info("Task is being executed by another instance.");}
}

7、Elastic-Job实践示例

7.1 项目初始化与环境准备

引入依赖

org.apache.shardingsphere.elasticjobelasticjob-lite-spring-boot-starter${latest.version} 

注意:如果项目中已使用较高版本的Curator(ZooKeeper客户端),可能需要排除Elastic-Job内置的较低版本Curator以避免冲突。

配置ZooKeeper连接:Elastic-Job依赖ZooKeeper进行分布式协调。你需要在配置文件中指定ZooKeeper服务器地址和命名空间。(application.yml)

elasticjob:reg-center:server-lists: localhost:2181 # ZooKeeper地址namespace: your-elasticjob-namespace # 用于区分不同环境或应用

7.2 定义与配置作业

实现任务逻辑:创建一个类实现SimpleJob接口,并在execute方法中编写业务逻辑。ShardingContext参数提供了分片信息。

import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.simple.SimpleJob;
import org.springframework.stereotype.Component;
@Component
public class MySimpleJob implements SimpleJob {@Overridepublic void execute(ShardingContext shardingContext) {System.out.println("任务分片总数: " + shardingContext.getShardingTotalCount());System.out.println("当前分片项: " + shardingContext.getShardingItem());System.out.println("分片参数: " + shardingContext.getShardingParameter());// 在这里编写你的业务逻辑// 例如,根据当前分片项处理对应的数据}
}

配置与启动作业 (application.yml):

elasticjob:jobs:my-simple-job: # 作业名称elastic-job-class: com.yourpackage.MySimpleJob # 任务类全限定名cron: "0/5 * * * * ?" # Cron表达式,每5秒执行一次sharding-total-count: 3 # 总分片数sharding-item-parameters: "0=A,1=B,2=C" # 分片参数(可选)overwrite: true # 是否覆盖本地配置到注册中心

应用启动后,Elastic-Job会自动根据配置创建并调度作业。

7.3 高级特性

  • 分片机制
    • 这是Elastic-Job最核心的概念。它允许将一个任务拆分成多个独立的任务项(分片),由分布式的服务器分别执行。例如,有3台服务器处理100条数据,可以设置sharding-total-count: 3,每台服务器通过shardingContext.getShardingItem()拿到自己的分片号(0,1,2),然后处理对应的数据(如对数据ID取模)。这能极大提升任务处理效率。
  • 配置事件追踪(可选)
    • ​​​​​​​如果希望将作业执行痕迹(如执行开始、结束、异常等事件)持久化到数据库(如MySQL),可以进行如下配置。
elasticjob:tracing:type: RDB # 使用关系数据库存储事件轨迹

确保Spring容器中已经配置了DataSource Bean。

  • 使用作业监听器(可选)
    • ​​​​​​​​​​​​​​监听器允许在作业执行前和后执行自定义逻辑。AbstractDistributeOnceElasticJobListener可保证在分布式环境下监听逻辑只在其中一个节点执行一次。将监听器声明为Spring Bean,它通常会被自动探测并注册。
public class MyJobListener extends AbstractDistributeOnceElasticJobListener {public MyJobListener(long startedTimeoutMilliseconds, long completedTimeoutMilliseconds) {super(startedTimeoutMilliseconds, completedTimeoutMilliseconds);}@Overridepublic void doBeforeJobExecutedAtLastStarted(ShardingContexts shardingContexts) {System.out.println("作业开始前执行...");}@Overridepublic void doAfterJobExecutedAtLastCompleted(ShardingContexts shardingContexts) {System.out.println("作业结束后执行...");}
}

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

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

相关文章

运输公司网站模板辽宁建设工程信息网变更

文章目录 一、if语句1.if语句2.if 和 elif区别3.三元表达式 二、循环语句1.range函数和循环结束关键字2.while循环3.for循环 三、逻辑运算符1.and语句2.or语句3.not语句4.逻辑运算法的优先级 四、python运算符优先级和结合性一览表 一、if语句 1.if语句 1.if单分支语句 格式…

【Nordic】nRF9151的SLM例程常用AT指令说明

nRF9151的SLM例程常用AT指令说明 本文章主要讲解如何使用nRF9151DK测试SLM例程并且列出常用的AT指令一、SLM介绍 SLM(Serial LTE Modem)是 Nordic Semiconductor 提供的一种基于串口的 LTE 调制解调器解决方案。它通…

sql server经典语句「转」

1.按姓氏笔画排序: Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as 2.数据库加密: select encrypt(原始密码) select pwdencrypt(原始密码) select pwdcompare(原始密码,加密后密码…

Codeforces 2149G Buratsuta 3 题解 [ 蓝 ] [ 摩尔投票 ] [ 线段树 ] [ 随机化 ] [ 主席树 ] [ 根号分治 ]

Buratsuta 3:典中典中典中典中典了属于是。 Sol.1 摩尔投票 首先维护区间出现次数大于等于 $\left \lfloor \dfrac{len}{k} \right \rfloor $ 次的数是摩尔投票板子,每次把 \(k\) 个不同的数相消即可。然后因为摩尔投…

2025 年最新推荐软件开发机构榜:聚焦微服务架构与 724 小时服务的优质厂商精选指南人力资源管理系统/资产管理系统/数据中台管理系统/流程管理系统软件开发公司推荐

当前数字化转型浪潮下,政企机构对软件开发服务的需求愈发旺盛,涵盖 CRM 系统、物联网、运维管理等多类场景。但市场中厂商资质参差不齐,部分厂商技术架构落后,难以适配业务增长;部分重开发轻售后,故障响应迟缓;…

【半导体物理 | 学习笔记】第一章 半导体中的电子状态

一、半导体的晶格结构和结合性质 金刚石结构和共价键 典型代表:硅、锗晶体正四面体晶胞结构:两个面心立方晶胞套构共价键结合闪锌矿型结构和混合键 典型代表:砷化镓等III-V族晶胞结构:两个面心立方晶胞套构混合键共…

网站如何换域名广州网站建设培训学校

一、栈 栈(stack)又名堆栈,它是一种运算受限的线性表,限定仅在表尾进行插入和删除操作的线性表 表尾这一端被称为栈顶,相反地另一端被称为栈底,向栈顶插入元素被称为进栈、入栈、压栈,从栈顶删…

计数(5):多项式相关

计数中我目前只见过两类与多项式相关的问题,一类是采用 gf 来刻画,一类是用拉插来优化掉 dp 的很大一个维度,还有一类就是神秘多项式问题,但是考虑 fft 已经被 cnoi 除名了所以我就不学了( 这部分写的非常浅显,我…

最新WTAPI开发微信机器人教程说明

最新WTAPI开发微信机器人教程说明 微信二次开发机器人接口开发:框架提供了开放接口,可以通过这些接口对微信进行操作。如接收用户消息、发送消息、操作朋友圈等。 自然语言处理:机器人需要能够理解自然语言,以便能…

线性DP - 学习笔记

动态规划:用空间代替重复计算。 有些递归在展开计算时,总是重复调用一个子问题的解,这种重复调用的递归变成动态规划很有收益。 如果每次展开都是不同的解,或者重复调用的现象很少,那么没有改动态规划的必要。 任…

2025 年最新制氮机厂家权威推荐排行榜:聚焦行业优质厂商综合实力,助力企业精准选购优质设备制氮机产生氮气/氮气纯化/设备改造/维修/保养/半导体用制氮机厂家推荐

在工业生产持续升级的当下,制氮机作为保障多行业生产安全、提升生产效率的关键设备,市场需求日益旺盛。但当前制氮机市场品牌繁杂,产品质量参差不齐,部分厂商技术落后导致设备能耗高、纯度波动大,还有些厂商售后体…

南京的网站建设高端网站的建设

一、效果图 1.点击显示菜单栏&#xff0c;点击x号关闭&#xff1b; 2.点击一级菜单&#xff0c;展开显示二级&#xff0c;并且加号变为减号&#xff1b; 3.点击其他一级导航&#xff0c;自动收起展开的导航。 二、代码实现 <!DOCTYPE html> <html><head>&…

现在asp做网站ai效果图网站

0x01应用场景 获取JavaCard卡内剩余空间&#xff0c;一方面是在评估一张卡的时候需要用到&#xff0c;另一方面是在应用个人化或者运行时需要用到。 例如&#xff1a;应用提供商为了保证自己的应用在卡内运行期间能够不受空间影响&#xff0c;一般会在个人化(安装应用)的时候先…

2025 年氨分解设备厂家最新推荐榜单:含半导体 / 冶金 / 稀土行业专用设备及品牌综合实力排名

随着双碳目标深入推进,氨分解制氢技术在氢能产业中的应用愈发广泛,2025 年全球市场规模预计达 28.7 亿美元。然而,行业发展面临诸多痛点:催化剂性能与成本难以平衡,铁基催化剂转化率低、钌基催化剂成本高;设备能…

idea打包推送maven仓库及同时推送到不同的maven仓库,本地和云上的腾讯云

idea打包推送maven仓库及同时推送到不同的maven仓库,本地和云上的腾讯云idea打包推送maven仓库及同时推送到不同的maven仓库,本地和云上的腾讯云 idea客户端打包推送jar报错如下:Execution failed for task :scoote…

2025 阳台柜厂家最新推荐榜:企业资质 / 材质 / 服务全景解析,选对品牌少走弯路杭州阳台柜/浙江阳台柜厂家推荐

阳台已从传统功能区升级为 “家庭第二客厅”,但消费者选购阳台柜时仍面临多重困扰:部分产品在高湿高晒环境下易发霉变形,寿命不足 3 年;多数品牌缺乏全链条服务,设计与落地严重脱节;中间商溢价使性价比大打折扣,…

广州个人网站搭建天津招标信息网

前面两篇文章已经整理了CompletableFuture大部分的特性&#xff0c;本文会整理完CompletableFuture余下的特性&#xff0c;以及将它跟RxJava进行比较。 3.6 Either Either 表示的是两个CompletableFuture&#xff0c;当其中任意一个CompletableFuture计算完成的时候就会执行。 …

2025 年除湿机厂家最新权威推荐排行榜:实力厂家技术口碑评测及场景适配选购指南吊顶/泳池/车库/防爆/调温/新风除湿机厂家推荐

当前除湿机市场需求持续攀升,工业生产对湿度精度要求愈发严苛,民用场景也对环境舒适度有了更高追求,但行业乱象却让用户选购难度大增。一方面,大量产品缺乏核心技术,除湿效率低、能耗高,难以适配电子、制药、家用…

2025 年液氨蒸发器厂家联系方式,众众电热:多领域加热设备供应与定制化解决方案提供商

在政策支持与产业升级的双重驱动下,液氨蒸发器等工业加热设备市场持续扩容,2024 年上半年市场规模已突破 52.7 亿元,预计 2025 年末将增至 68.5 亿元。化工合成、制冷储能等领域的需求增长,以及智能化、低能耗的技…

debian11不进入桌面环境打开chromiu

debian11不进入桌面环境打开chromiu在Debian非桌面环境中,使用Wayland(Weston)打开Chromium并打开特定网页,可以按照以下步骤进行:安装Weston和Chromium启动Weston合成器在Weston环境中启动Chromium 1,安装chrom…