当前位置:网站首页>分布式时间槽elastic timeslot架构设计

分布式时间槽elastic timeslot架构设计

2022-08-11 11:00:00 InfoQ

背景

调度引擎是关键的基础设施,不但是定时执行任务,更是大规模分布式任务引擎,分布式并行处理平台,管理计算节点集群,提供高吞吐的可伸缩的数据处理能力。
同时,分布式调度引擎也是 
datax
sentinel dashboard
分布式改造的核心技术
根据场景,调度引擎分为分布式定时任务,处理大规模数据任务;分布式时间槽,处理大量任务
本文介绍
分布式时间槽
的架构设计,分布式特性依赖《分布式服务支撑平台》
时间轮/时间槽 
时间轮是由时间槽组成的环形队列,时间槽内存放作业链表,秒针如时钟秒针一样,一个时间间隔走过一个时间槽,执行时间槽内任务
时间轮算法优势,以较少资源代价管理大量任务,缺点触发时间不支持cron,分布式化困难,因此本组件采用分布式作业分片的机制,实现分布式时间槽

术语

无中心/有中心分布式
 有中心分布式设置中心节点负责集群协调和元数据保存等工作,例如 xxl-job 的 admin/executor,dolphin-scheduler master-worker 都是有中心分布式设计;真正无中心设计很少,大部分是节点平等,都可以通过选举成为主节点,也就是,任何一个节点都可以成为中心
脑裂
 无中心分布式设计,当网络出现问题,节点分割成多个集群,集群间因不能通讯而不能达到状态一致,通常解决方案是集群节点数奇数,节点数少于总数的集群中一半停止工作
分片/容错 
分片是调度平台很重要的特性,调度处理大规模数据,需要分片执行,分片执行带来新的问题,分片失败,平台回收分片,转移到其他节点执行

参考

分布式支撑平台 《分布式支撑服务平台设计说明书.docx》

设计原理

null

技术架构

null
作业命名空间
 时间槽,定义作业类型,触发时间,可看成调度器
作业实例
 分片执行主体,依赖elastic平台,实现分布式特性
分片
 实际是作业,有自己的独立配置,是作业类型的实例
管理台
 client提交/撤销作业,写入分片
  • znode设计
在分布式支撑服务平台的基础上,增加对时间槽的扩展
Znode用途参考《分布式支撑服务平台设计说明书.docx》
null
/sharding
/config 存放作业(分片)的业务配置
P.S. /config存放调度配置

详细设计

null
*这是现在分布式时间槽的状态,以后考虑与调度作业的融合
下面详细介绍每个模块

作业注册

spring boot starter机制初始化
null
ElasticJobLiteAutoConfiguration
 spring boot自动配置主入口,import 其他的自动配置
ElasticJobBootstrapConfiguration 
初始化 JobBootstrap,从 ElasticJobProperties 获取 ElasticJob 实例,构建 JobBootstrap,注册到 SingletonBeanRegistry,spring bean 工厂可获取
ScheduleJobBootstrapStartupRunner 
CommandLineRunner 实现,从spring bean 工厂获取Sch
eduleJobBootstrap 实例,注册到本地quartz作业

作业调度

null
JobScheduler
 作业调度器,作业执行环境初始化,构建和初始化 quartz scheduler
AppRegistryContext
 单例,应用上下文,持有JobScheduleController
JobScheduleController
 quartz 调度器的封装
ScheduleJobBootstrap/OneOffJobBootstrap
 使用JobScheduler 调度作业

作业设计

null
ElasticJob 标记类
ElasticJobExecutor 作业执行逻辑,使用 JobItemExecutor 执行作业,在5.2 作业注册和调度进一步分析
JobItemExecutor 两类作业,Typed/Classed,Typed 类型作业实现远程调用执行器, 如 http,feign,不用实现作业类,作业进程是通用的执行节点,不会依赖作业业务;Classed 实现执行器/作业
SimpleJobExecutor/SimpleJob 简单作业实现,平台提供其他常用作业实现,如,script,http,dataflow,这是一对配套实现

作业执行设计

elastic-timeslot 作业是分片执行,作业运行实例下线失效转移,支持弹性计算,新上线节点在新一轮调度分配任务
null
  • 运行实例自身是quartz单机调度引擎,quartz调起执行LiteJob
  • LiteJob(实现quartz Job)转到elastic-timeslot的作业执行器
  • elastic-timeslot的作业执行器是主要的执行逻辑
  • 清理分片,包括清理上轮执行的completed标记,清除cancel标记的分片分片,elastic-timeslot采用eager模式分片,即,分配所有分配
    *
    获取本实例分配到的分配,执行检测是否有未完成的分片,若有,回到3.2;若没有,退出
*另一个分配模式,on_demand,按需分配,用于大任务

执行器设计

null
ListJob/JobItemExecutor/ElasticJob
 elastic-timeslot可以看作分布式 quartz,分片作业由 quartz Scheduler调起
ListJob 实现了 quartz 的 job 接口作为 quartz 与 elastic-timeslot 作业的桥接,用 quartz 的参数机制注入 
ElasticJobExecutor
null
这样静悄悄地桥接到 elastic-timeslot 的执行器,执行elastic-timeslot的逻辑

设置服务设计

分布式时间槽
设置服务
包装分布式支撑平台的设置服务(初始化分布式服务),初始化自身的服务,包括回调机制,作业配置写入,作业触发服务

分布式事件回调/应用控制接口设计

应用与分布式支撑分离,这是设计的关键之一,相关两个设计:分布式的事件通知应用回调;应用的控制接口
InstanceShutdownCallback 实例关闭回调,关闭调度器
RegistryCenterConnetionDownCallback zookeeper下线回调,暂停调度器
RegistryCenterReConnetionCallback zookeeper重新上线回到,注册运行实例,重启调度器

诊断服务

分布式环境复杂,偶尔出现不一致状态,这些状态不能自动回复,需要额外检查恢复

7.6.1 作业超时检测(TBD)

分布式时间槽分片是独立作业,但作业命名空间调度是一个整体,即所有分片结束整个调度才结束,如果出现其中一个分片超时(可能是代码问题,连接数据库等),其他作业跟着超时,对于大规模作业不可接受,超时检测发现作业超时未完成,强制终止作业,并撤销,待开发者处理后重新提交

7.6.2 作业分配给下线运行实例

查找分配给
已下线实例
的分片,注销分配即可,需要增加主节点选举latch

作业管理台

null
作业配置管理,作业管理,作业统计,服务节点与实例统计,分片操作,分片统计

代码库(整理中...)

分布式支撑平台:
分布式时间槽:

附录

规划

  • 定时任务和时间槽架构融合
实现两大目标,应用与分布式服务平台分离,时间槽和调度作业共享基础组件最大化
null
原网站

版权声明
本文为[InfoQ]所创,转载请带上原文链接,感谢
https://xie.infoq.cn/article/19bebe7bed6c8fea0d944659f