本文原文链接
尼恩说在前面
在45岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团、蚂蚁、得物的面试资格,遇到很多很重要的相关面试题:
问题7:设计分布式调度框架,该考虑哪些问题?
最近有小伙伴面试招行, 问到了相关的面试题。
小伙伴没有系统的去梳理和总结,所以支支吾吾的说了几句,面试官不满意,面试挂了。
所以,尼恩给大家做一下系统化、体系化的梳理,使得大家内力猛增,可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”,然后实现”offer直提”。
当然,这道面试题,以及参考答案,也会收入咱们的 《尼恩Java面试宝典PDF》V175版本,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。
《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请到文末公号【技术自由圈】获取
招商银行的高阶Java后端面试真题
被狠狠拷打了,问的人都懵了。项目场景题太难了,不好好准备,真的答不出!

尼恩将给出全部答案:
1.如何让系统抗住双十一的预约抢购活动?
2.如何从零搭建10万级QPS大流量、高并发优惠券系统?
3.百万级别数据的 Excel 如何快速导入到数据
4.如何设计一个支持万亿GB网盘实现秒传与限速的系统?
5.如何根据应用场景选择合适的消息中间件?
6.如何提升 RocketMQ 顺序消费性能?
即将发布。
7.设计分布式调度框架,该考虑哪些问题?
本文
9.如何让系统抗住双十一的预约抢购活动?
10.问 :如何解决高并发下的库存抢购超卖少买?
即将发布。
11.为什么高并发下数据写入不推荐关系数据?
12.如果让你设计一个分布式链路跟踪系统?
即将发布。
前几天 尼恩给一个 小伙伴改造过一个 100wtps 链路跟踪平台简历, 非常NB, 牛到暴表。
本文目录
分布式调度框架 , 如何协调多个节点或服务执行任务成为一个关键问题。
分布式调度框架 , 如何可以调度成千上万的任务,在多个节点上分配、执行和监控任务,确保任务按时执行和任务结果的可靠性。
分布式调度框架的核心功能
什么是 任务调度 ?
任务调度,顾名思义,是指对计算任务进行合理安排和调度的过程。
在计算机领域,任务调度主要指的是对计算任务在计算资源上的分配和执行顺序的管理。
通过任务调度,可以有效利用计算资源,提高系统的运行效率和性能。
什么是分布式 任务调度 ?
高并发、大数据、AI智能体 时代来了。
单一计算节点已经无法满足海量数据处理和复杂计算的需求。
分布式系统以其能够横向扩展、高可靠性等优势成为了解决这一问题的主要手段。而
在分布式系统中,任务调度则更加复杂和关键,需要考虑到网络通信、节点故障、数据一致性等诸多因素,以确保任务能够按时完成并保持系统的稳定运行。
什么是分布式 任务调度 ?
分布式调度指的 调度器会根据预设的任务计划或者触发条件,在多个节点上启动任务、监控任务。
与传统的单机调度不同,分布式调度的核心在于: 如何确保在分布式环境下,任务可以被多个节点安全、有效地执行,并保证系统的可扩展性和高可用性。
分布式调度框架的主要功能
任务调度:
负责触发定时任务,并将任务分配给多个工作节点。调度任务可以按时间计划执行(例如:定时、周期性任务)或者事件触发执行。
任务管理:
任务可以动态调整,如暂停、恢复、重启、取消等操作。任务的执行情况也可以通过调度框架进行管理,比如监控当前任务执行进度和状态。
任务监控:
监控调度系统中的每个任务的执行情况,提供实时反馈,确保任务能够按时完成。
任务容错:
当任务在执行过程中遇到错误时,分布式调度框架需要提供自动重试、失败处理等机制,确保任务最终能正确执行。
分布式调度框架的核心业务场景
定时任务调度:
企业级应用中常常有定时执行的任务,如定时生成报表、定时备份数据等。
分布式调度框架可以实现定时任务的分布式调度,确保任务在指定的时间准确执行,提高任务执行的可靠性和可扩展性。
大数据处理:
如Hadoop、Spark等大数据平台需要处理海量数据,而分布式调度则负责协调这些任务的执行。
ETL(Extract,Transform,Load)处理调度:在数据仓库和数据湖的建设中,需要从多个数据源抽取数据、进行清洗和转换,并加载到目标存储中。分布式调度框架可协调多个任务并行执行 ETL 操作,提高数据处理效率和可靠性。
尼恩2021年做了一年的大数据中台架构, 通过封装和改造azkban 实现了一个 分布式调度框架,具备DAG 的任务编排能力。
金融系统定时任务:
如银行定期批处理交易,生成对账单等。
电商系统中的任务调度:
如促销活动的定时开始和结束、库存同步等。
分布式任务调度的核心组件
调度器(Scheduler)
调度器负责接收任务,并根据预先设定的调度策略,决定将任务分配给哪些执行器执行。
任务执行器(Executor)
任务执行器负责接收调度器分配的任务,并在本地执行任务的具体操作,如计算、存储等。
任务队列(Task Queue)
任务队列用于存储待执行的任务,调度器从任务队列中取出任务进行调度。
分布式任务调度的架构模式
-
集中式 vs 去中心化
-
主从(Master-Slave)架构
-
对等(Peer-to-Peer)架构
集中式 vs 去中心化
集中式架构模式下,存在一个 中心调度器 Scheduler 负责任务调度和资源管理,
去中心化架构模式下, 不存在一个 中心调度器 Scheduler ,而是 将任务调度和资源管理分散到各个节点上,通过协作完成任务调度。
集中式架构简单直观,但容易成为单点故障;
去中心化架构则更具弹性和扩展性,但需要解决节点间通信和协调的问题。
主从(Master-Slave)架构
主从架构中,存在一个主节点负责全局调度 Scheduler 和资源管理 Resource Manager,而从节点负责执行任务,承担 Executor 角色。
主从架构简单易于实现,但主节点压力较大,可能成为瓶颈。
在故障情况下,需要确保主从切换的高可用性。
对等(Peer-to-Peer)架构
对等架构中,各个节点对等地协作完成任务调度和资源管理,不存在明显的主从关系。
对等架构分散了调度和资源管理的压力,更具弹性和容错性,但需要解决节点间协调和一致性的问题。
常见的分布式调度框架包括:
Quartz:
经典的开源调度框架,支持复杂的调度表达式和分布式任务调度。
Quartz 核心组件:包括 Scheduler(调度器)、Trigger(触发器)、Job(作业) 等。
Scheduler 负责管理所有任务的调度,是 Quartz 的核心

ElasticJob:
当当开发的基于 ZooKeeper 的分布式调度框架,具有强大的任务分片功能。

ElasticJob 核心组件:Resource Management、Cloud Scheduler、Cloud Executor
ElasticJob 使用 Zookeeper 作为注册中心。
Zookeeper 用于存储和管理作业的配置信息、服务器信息以及作业运行状态。
Zookeeper 的高可用性和分布式特性使得 ElasticJob 能够在复杂的分布式环境中稳定地运行。
这些核心组件共同协作,使得 ElasticJob 能够在分布式环境中高效地进行任务调度和管理,具备强大的弹性伸缩能力和高可用性。
XXL-JOB:
轻量级的分布式调度框架,提供了简单的 API 设计和监控界面,适合中小型项目。
XXL-JOB 核心组件:调度中心(SchedulerCenter )和 执行器(Executor)

XXL-JOB调度中心(SchedulerCenter /admin )功能:
-
任务管理:负责任务的创建、编辑、删除等操作,支持多种调度类型,如 Cron 表达式调度、固定频率调度等。
-
执行器管理:管理执行器节点,包括执行器的注册、心跳检测和负载均衡。
-
日志管理:记录任务的执行日志,便于问题排查和审计。
-
监控与报警:监控任务的执行状态,并在任务执行失败时提供报警通知。
-
Scheduler /admin 基于 Spring Boot 开发,提供 Web 界面,用户可以通过图形化界面进行任务的管理和监控。
XXL-JOB执行器(Executor)功能:
-
任务执行:接收调度中心下发的任务请求,并执行具体的业务逻辑。
-
心跳机制:定期向调度中心发送心跳,以保持连接状态并报告自身状态。
-
任务分片:支持任务分片功能,能够将任务拆分成多个子任务,由不同的执行器节点并行执行。
-
部署:XXL-JOB执行器(Executor) 可以部署在多个节点上,实现任务的并行执行和负载均衡。
XXL-Job的工作流程
XXL-Job 调度平台触发任务流程

XXL-JOB 调度平台触发任务的流程可以分为以下几个关键步骤:
阶段1:调度中心(Admin)触发任务
调度中心(scheduleCenter)操作:
第一步:扫描任务:
调度中心会定期扫描数据库中的任务表(xxl_job_info),查找即将到达触发时间的任务。
调度中心会按照任务配置的调度规则(比如 Cron 表达式等)来扫描最近 5 秒内需要触发的任务。
当判断某个任务到达触发时间时,便会启动后续的任务分配流程。
第2步:获取执行器:
根据任务的路由策略,从注册的执行器列表中获取对应的执行器 IP 和端口。
scheduleCenter 会依据预先设定的路由策略(例如轮询、随机、一致性哈希等路由策略),获取对应的执行器(Executor)的 IP 地址,通过执行器的 IP 及端口信息选取合适的 Executorbiz。
第3步:更新状态:
将任务的状态更新为“触发中”,并设置任务的下次触发时间(nextTriggerTime),以避免任务被重复触发.
scheduleCenter 会更新任务信息表(xxl_job_info)中该任务的下一次触发时间(nextTriggerTime),同时将任务相关信息放置到一个类似 “ring 环” 的结构中,并且修改下次触发时间,这样做的目的是避免该任务在本轮处理中再次被错误捞取到,保证任务调度的有序性。
阶段2:任务下发与执行器接收阶段
scheduleCenter 通过 Executorbiz Client 传递任务。
scheduleCenter 借助 Executorbiz Client 向选取到的执行器(Executor)发送任务执行请求,告知执行器有任务需要执行。
Executorbiz Client 通过 NettyClient发送 HTTP 请求,将触发任务的指令发送给对应的执行器(Executor),请求中包含任务 ID、任务参数等信息.
阶段3:执行器内部任务处理阶段
第1步:接收请求:
执行器接收到调度中心的触发请求后,会创建一个 JobThread 线程来处理任务。
在执行器端,每个任务对应的 JobThread 发挥作用。
每个 jobId 对应一个 JobThread,并且一个 JobThread 可能会被触发多次,当被触发多次时,会将这些触发任务按顺序放置在 Queue(队列)中,然后 JobThread 会按照顺序依次处理队列中的任务。
第2步:加入任务队列:
如果任务被多次触发,JobThread 会被放入任务队列(JobThreadQueue)中等待执行。
第3步:顺序执行:
JobThread 按顺序从队列中取出任务进行执行。执行任务时,会调用用户定义的 run 方法来运行具体的业务逻辑.
JobThread 处理完任务之后,会通过 TriggerCallbackTread 的 pushCallBack 方法,将任务执行的相关信息加入到回执队列(callBackQueue)中,准备向调度中心反馈执行结果。
阶段4:任务执行结果反馈阶段
任务执行完成后,执行器会将执行结果通过 TriggerCallbackThread 发送回调请求给调度中心,更新任务的执行状态和日志信息。
TriggerCallbackTread 处理反馈的流程:
-
TriggerCallbackTread 会轮询处理 callBackQueue 中存放的数据,它会将执行器端任务执行的结果信息发送回调度中心(Adminbiz Server)。
-
一旦执行结果信息放入到队列之后,执行器这边会立刻返回调度结果给调度中心,告知调度中心任务已执行完毕且结果已在反馈队列中等待进一步处理。
阶段5:调度中心 scheduleCenter 处理回调
调度中心(Adminbiz Server)接收到执行结果反馈后,会进行相应的处理,比如更新任务的状态(成功、失败等),并且会上锁操作相关数据记录,确保在更新状态等操作时数据的一致性和准确性,完成整个任务触发及执行结果反馈的完整流程。
第1步:接收回调:
调度中心接收到执行器发送的回调请求后,会根据任务 ID 查找对应的任务记录.
第2步:更新任务状态:
根据执行结果更新任务的状态,如成功、失败等,并记录任务的执行日志到 xxl_job_log 表中.
第3步:释放锁:
如果任务执行过程中使用了锁(如 xxl_job_lock 表),在任务执行完成后会释放锁,以便其他任务可以继续执行.
阶段6:调度中心 scheduleCenter任务监控与管理:
任务监控:
调度中心会持续监控任务的执行情况,包括任务的执行状态、执行时间、执行结果等.
任务管理:
提供任务管理界面,用户可以查看任务的详细信息,进行任务的暂停、恢复、删除等操作.
整个任务触发流程涉及到调度中心和执行器之间的协同工作,通过任务队列和回调机制来确保任务的有序执行和状态更新,从而实现高效、可靠的分布式任务调度.
Executor 和 ScheduleCenter 双向 RPC的流程:
ScheduleCenter 初始化两个 核心组件: Adminbiz Server和 Executorbiz Client;
Executor 初始化两个 核心组件: Adminbiz Client 和 Executorbiz Server。

Executor 和 ScheduleCenter 双向 RPC的流程:
ExecutorBiz Server: Executor端的RPC服务,使用Netty开发的 Http Server。
ExecutorBiz Client: ScheduleCenter 为每一个 Executor 新建一个RpcBean( XxlRpcRefere

最低0.47元/天 解锁文章
1142

被折叠的 条评论
为什么被折叠?



