宜信微服务任务调度平台建设实践|分享实录(附视频)

内容来源:宜信技术学院第4期技术沙龙-线上直播|宜信微服务任务调度平台建设实践html

主讲人介绍git

梁鑫:宜信高级架构师&开发平台负责人 github

本文字数:7693字web


导读:现在,不管是互联网应用仍是企业级应用,都充斥着大量的批处理任务,经常须要一些任务调度系统帮助咱们解决问题。随着微服务化架构的逐步演进,单体架构逐渐演变为分布式、微服务架构。微信

在此背景下,不少以前的任务调度平台已经不能知足业务系统的需求,因而出现了一些基于分布式的任务调度平台。这些平台各有其特色,但也各有不足之处,好比不支持任务编排、与业务高耦合、不支持跨平台等问题,不是很是符合公司的需求,所以咱们开发了微服务任务调度平台(SIA-TASK)。本次分享主要围绕SIA平台展开,包括研发背景设计思路和技术架构,以及如何支持业务方。网络


分享大纲:多线程

1、SIA-TASK的产生(背景、问题等)架构

2、SIA-TASK的核心设计思想(组成、运行、特性、关键点等)并发

3、SIA-TASK组成模块(调度器管理、监控、日志等)app

4、开源


如下为直播视频,可点击回放,时长43m42s,建议在WiFi环境下观看。


分享实录

1、SIA-TASK的产生 

1.1 背景

不管是互联网应用仍是企业级应用,都充斥着大量的批处理任务,经常须要一些任务调度系统帮助咱们解决问题。 随着微服务化架构的逐步演进,单体架构逐渐演变为分布式、微服务架构。
在这样的背景下,不少以前的任务调度平台或组件已经不能知足业务系统的需求,因而出现了一些基于分布式的任务调度平台。这些平台各有其特色,但也各有不足之处,好比不支持任务编排、与业务高耦合、不支持跨平台等问题。

1.2 种类

按照任务与时间的关系, 咱们把批处理任务分红三类,飞机型、地铁型、公共汽车型。
  • 飞机型是指每一年/月/周/天固定某一时刻执行的任务。这种任务在咱们的业务系统中很是常见,好比天天1点要执行一个跑批任务去清理前一天的日志;每个月10号要给公司全员发工资,这些都属于飞机型任务。 

  • 地铁型是指每隔固定时间执行任务,不可并发。咱们也常常遇到这样的批处理任务,第一个任务没有结束,第二个任务是不能够执行的,这就是不可并发。 

  • 公共汽车型是指每隔固定时间执行任务,可并发。若是是公共汽车型的任务,前一个任务没有结束,下一个任务也能够按点开始执行。

1.3 问题

在跑批任务的过程当中会遇到如下问题:
  • 遗忘,忘记了还在运行的定时任务。在咱们公司发生过一个这样的案例,若干年前的一个冬天,咱们的一个项目团队用3个月的时间作了一个项目,运行一段时间后发现项目的效果并非很理想,便将相关的程序都停掉了,却忘了有一个跑批任务的节点还在继续运行,直到两年后,这个节点产生的日志把磁盘填满了,触发了监控报警,咱们才发现。 

  • 单点,就是没有热备,跑批任务是一个单点运行的定时任务,出了故障须要转入手工处理。 

  • 依赖,利用时间差来处理依赖反复形成问题数据。你们知道项目有的时候是须要有依赖关系的。好比某个项目的跑批流程A和跑批流程B存在前后次序,项目组设置跑批流程A在凌晨2点运行,跑批流程B在凌晨4点运行,从时间上保证前后次序,万一跑批流程A执行时间过长,超过2小时,就会致使数据出现问题,须要手工处理出现问题的数据。

1.4 关系

前文提到 任务之间是有关系的 ,那到底存在哪些关系呢?我认为主要有如下3种:
  • 串行,存在前后关系的两个任务。即任务B在任务A后执行,要先执行任务A以后再执行任务B。 

  • 并行,能够并发执行的两个任务。好比任务B和C都要在任务A以后执行,而任务A执行完成后,任务B和C能够同时执行,那B和C就是并行关系。 

  • 分支,根据前置任务的返回结果进行判断,不一样的结果执行不一样的后续任务。好比返回0的时候,执行任务A,返回1的时候执行任务B,这是一种分支的状况。

1.5 思考

基于上述的几种关系,咱们在建设任务调度平台的时候会思考如下两个方面:
  • 平台化。项目团队老是但愿把更多的精力投入到业务开发中,但愿把其它与业务开发无关的事情尽量地放到架构团队。他们但愿有一个执行任务的平台,仅仅须要把编写好的业务逻辑放到这个平台就能够了,这个平台会完成全部的工做,项目组只须要关心业务逻辑。 

  • 微服务。为了更好地知足项目的需求,咱们但愿能把任务的业务逻辑和任务的编排调度区隔开来,采用注册和发现机制来建设任务调度平台,与业务相关的部分交给项目团队处理,把其余的部分交给任务平台来处理。

1.6 因素

除了上述两个方面的考虑之外,咱们还须要 思考如下八个因素。
  • 任务编排。多个业务之间的定时任务存在流程次序,前面提到任务之间有并行的关系、有串行的关系,还有分支的关系,咱们但愿平台能有相应的编排功能去处理和支持这些任务。 

  • 任务分片。对于一个大型任务,须要分片并行执行。 

  • 跨平台。除了使用 Java 技术栈(SpringBoot、Spring等)的项目以外,还要可以支持使用其余语言的应用。 

  • 无侵入。业务不但愿与调度高耦合,只关注业务的执行逻辑,但愿平台对业务自己代码是无侵入的,将影响降到最低。 

  • 高可用/故障转移。调度系统自身必须保证高可用,不能有单点,任务执行过程当中遇到问题有补偿措施,可以平滑处理,减小人工介入。 

  • 可视化。任务调度的操做提供可视化页面,方便使用。 

  • 实时监控。平台要有实时监控系统,实时获取任务的执行状态。 

  • 动态编辑。业务的任务时钟参数可能变更,在可视化的基础上,对全部任务执行的操做都实时反映到业务系统中去,不须要停机部署。

基于以上的背景与考虑,咱们建设了微服务任务调度平台SIA-Task。


2、SIA-TASK的核心设计思想

2.1 简介

SIA是“Simple is Awesome”的简称。
SIA-TASK(微服务任务调度平台)是其中的一项重要产品, SIA-Task契合当前微服务架构模式,具备跨平台、可编排、高可用、无侵入、一致性、异步并行、动态扩展、实时监控等特色。
SIA-TASK是任务调度的一体式解决方案,对任务进行元数据采集,而后进行任务可视化编排,最终进行任务调度,而且对任务采起全流程监控,简单易用。 对业务彻底无侵入,经过简单灵活的配置便可生成符合预期的任务调度模型。
SIA-TASK借鉴微服务的设计思想,获取分布在每一个任务执行器上的任务元数据,上传到任务注册中心。 利用在线方式进行任务编排,可动态修改任务时钟,采用HTTP做为任务调度协议,统一使用JSON数据格式,由调度中心进行时钟解析,执行任务流程,进行任务通知。

2.2 术语

简单介绍一下 SIA-TASK的术语。
  • 任务(Task) : 基本执行单元,执行器对外暴露的一个HTTP调用接口; 
  • 做业(Job) : 由一个或者多个存在相互逻辑关系(串行/并行)的任务组成,任务调度中心调度的最小单位; 
  • 计划(Plan) : 由若干个顺序执行的做业组成,每一个做业都有本身的执行周期,计划没有执行周期; 
  • 任务调度中心(Scheduler) : 根据每一个的做业的执行周期进行调度,即按照计划、做业、任务的逻辑进行HTTP请求,它是一个单独的节点; 
  • 任务编排中心(Config) : 编排中心使用任务来建立计划和做业; 
  • 任务执行器(Executer) : 接收HTTP请求进行业务逻辑的执行; 
  • Hunter: Spring项目扩展包,负责执行器中的任务抓取,上传注册中心,业务可依赖该组件进行Task编写。

Job、Task、Plan的关系

Task是业务执行的基本单元,执行器对外暴露的一个HTTP调用接口。若干个Task构成一个Job,而Plan是由若干个顺序执行的Job构成。
为何这里须要一个Plan? 有的时候两个任务不光有顺序关系(就是A任务执行完以后再执行B任务),还须要知足必定的时间要求,好比上午10点执行任务A,下午2点执行任务B,并且必须保证上午10点任务A按时执行完成。
打个比方,今晚8点有一场足球比赛的直播,若是晚上8点我还不能到家,那我就没办法看直播,而若是今天我下班早,下午6点多就到家,也必须等到8点才能开始看球赛,这就是Plan计划的来源。

2.3 组成

SIA-TASK任务调度平台如下几个部分组成:
  • 任务执行器 ,就是你的业务代码在哪里,这是属于项目组的。 
  • 任务注册中心 ,咱们用的是ZooKeeper。 
  • 任务编排中心  
  • 持久存储 ,咱们用的是MySQL。 
  • 任务调度中心

2.4 运行

接下来详细介绍 SIA-TASK的运行逻辑。
首先,经过注解抓取任务执行器中的任务上报到任务注册中心。任务执行器在启动的时候,会有一个叫online Task的注解,只要把这个注解放到control代码的方法上,就会自动把HTTP接口抓取出来,而后上报到任务注册中心,这里咱们用的是ZooKeeper。
任务编排中心从任务注册中心获取数据进行编排保存入持久化存储。也就是说,至关于在执行器里,把业务调用HTTP接口请求的URL地址、端口等实例抓取出来上传到ZooKeeper里,ZooKeeper就拿到了一个个的任务,ZooKeeper会把任务自己的信息抓取出来放到MySQL里。
这里要 区别一下什么是任务,什么是任务实例。 任务实例和任务的关系,有点像类和对象的关系,就是一份业务逻辑代码可能部署在多个节点上,也就是说这些节点的业务逻辑代码是如出一辙的,在运行阶段抓取的时候会把每一个节点上业务逻辑代码都抓取上来,针对这个业务它就是一个任务,可是每个端口、每一个IP地址对应的可能就是一个任务实例。好比高可用热备时,咱们会把任务自己的信息通过处理以后保存到持久存储里,而实例自己的信息只会停留在ZooKeeper里。
任务配置中心能够根据ZooKeeper里的信息和MySQL里的信息进行配置,就是根据抓取的任务,给这些Task加时钟、策略,而后编排出Job和Plan,并把如今的这些信息保存到MySQL里。
任务调度中心从持久化存储获取调度信息,知道编排的Job、Plan、时钟、策略等逻辑,任务调度中心按照调度逻辑访问任务执行器,对这些从执行器上抓取来的Task进行调度。
这就是SIA-TASK的运行逻辑,同时咱们会把调度日志存到Kafka里。

2.5 特性

1)基于注解自动抓取任务

在暴露成HTTP服务的方法上加入@OnlineTask注解,@OnlineTask会自动抓取方法所在的IP地址、端口、请求路径、请求方法、请求参数格式等信息上传到任务注册中心(zookeeper),并同步把任务信息写入持久化存储中。

2)基于注解无侵入多线程控制

单一任务实例必须保持单线程运行,任务调度框架自动拦截@OnlineTask注解进行单线程运行控制,保持在一个任务运行时不会被再次调度。并且整个控制过程对开发者彻底无感知。
就是在一个任务实例上,要保证任务在运行的时候是单线程状态。其实这是由用户本身控制的,若是须要是单线程的,这里能够加以控制;若是须要是多线程的,能够不加控制。这个控制并不须要另加代码,只须要在注解上去处理。

3)高度灵活任务编排模式

SIA-TASK的设计思想是以任务为原子,把多个任务按照执行的关系组合起来造成一个做业(Job)。同时运行时分为任务调度中心和任务编排中心,使得做业的调度和做业的编排分隔开来,互不影响。在咱们须要调整做业的流程时,只须要在编排中心进行处理便可。同时编排中心支持任务按照串行、并行、分支等方式组织关系。在相同任务不一样任务实例时,也支持多种调度方式进行处理,并且整个的处理编排都是在页面上完成的,这个功能很是好用,这也是SIA-TASK平台的一个亮点。

4)调度器自适应任务分配

任务执行过程当中出现失败、异常时,能够根据任务定制的策略进行多点从新唤醒任务,保证任务的不间断执行。咱们设定了不少策略,好比某个Task出现问题了怎么办?是再唤醒一次?仍是无论了?仍是人工干预发警报?咱们定制了不少策略去处理这些问题。

2.6 关键点

了解了平台特性,咱们来梳理 SIA-TASK的技术关键点。
  • 任务流 。实现任务与任务之间可配置的流向关系,造成有向无环图(DAG)。任务流可由定时时间(Cron 表达式)或外部请求(提供 API 地址) 开始,根据 DAG 逻辑执行。 
  • 元数据管理 。微服务中各个任务元数据的管理同步数据抓取、录入。 
  • 智能运维。 可视化的任务实时监控,全部监控都是有页面能够看到的;实时预警机制,出现问题的时候,会发送邮件或短信给相关人员告警;半智能化的自主修复,嗅探重试,不须要人工干预。 
  • 资源隔离。 进程间的资源隔离;进程内的资源隔离,提升系统吞吐,提供稳定性。时钟用的是Core Schedule,一个调度中心对一个项目组用一个Core Schedule,每一个项目组在同一个调度的时候,同一个调度器上都是隔离的,一个项目组出问题,不会影响到其余的项目组,这就至关于表明了隔离性负载均衡。 
  • 负载均衡。 调度中心调度任务的时候,任务的执行周期时间不同,可能有的任务须要的时间长一点,有的任务须要的时间短一点,调度器的资源也不太同样,有的CPU高一点,有的CPU低一点,那如何保证调度负载均衡?如何保证资源隔离的负载均衡?咱们会根据这种任务调度的历史值(任务耗时)以及机器自己性能的值进行考量,使每个任务调度中心拥有的调度数量差很少、消耗也差很少。这是一种新的负载,而不是简单的流量负载。


3、SIA-TASK组成模块

3.1 首页

任务调度管理首页主要包括三部分:调度器信息、调度次数、对接项目详情。
  • 调度器信息:调度中心调度器的数量。 
  • 调度次数:调度中心调度Job的历史累计总数。 
  • 对接项目详情:调度中心对接的项目组总数,Job总数。
目前SIA-Task平台上已经接入了51个项目,上面跑的Job数有600多个,今年上线的版本,Job已经跑了3000多万次。
调度器上有几个值须要了解一下, 每台调度器都有三个指标。
  • Job上限值: 所能负载的Job动态阈值; 
  • Job运行数量: 该调度器当前运行的Job数量; 
  • Job预警值: 当调度器运行的Job数超过预警值时,会发邮件通知管理员。

3.2 调度器管理

关于调度器有几个 信息须要了解,如图所示,点击某个调度器(柱状图),会显示 该调度器所抢占的Job详情列表:
  • JobKey :所配置的Job名称,每一个Job都有本身的名字。 
  • 类型 :配置Job的定时任务类型,分为Cron与fixRate两类。 
  • Job类型值 :若是是Cron表达式,6位时间戳怎么写;若是是fixRate,那就是须要间隔多少时间。 
  • 预警邮箱 :该Job配置的预警邮箱。 
  • 描述信息 :描述该Job的功能信息,便于管理员可以迅速发现某台调度器所抢占的Job详情。
调度器包括工做调度器、下线调度器、离线调度器、白名单。
  • 工做调度器: 这类调度器具备抢占和调度Job的能力。对某调度器进行下线操做,它会当即失去抢占Job的能力,已经抢占的Job执行完毕后会自动释放,进而被其余调度器抢占,调度器下线后会进入下线调度器列表中;工做调度器列表提供下线以及批量下线的功能。简单来讲,工做调度器就是正在工做中的调度器。 
  • 下线调度器 :这类调度器进程仍然存活,但失去了抢占Job与参与调度的能力。对这类调度器执行上线操做,会进入工做调度器列表,且开始具备抢占和调度Job的能力;下线调度器列表提供上线及批量上线的功能。就是说,下线调度器依然活着,只是再也不参与抢占Job,以前已经有的Job仍是会继续执行完成,若是点击上线就从新具有抢占Job的能力,变成工做调度器。 
  • 离线调度器 :这类调度器进程再也不存活,当下线调度器进程死亡后,会自动进入离线调度器列表,这类调度器进程从新启动后,会自动进入下线调度器列表;离线调度器列表也提供删除及批量删除的功能。离线调度器通常都是出现问题了,多是进程挂掉了,也多是网络故障了。 
  • 白名单 :将某个IP加入白名单以后,它具备调用全部执行器实例的权限;白名单列表提供批量删除的功能,删除该IP后自动失去该权限。 

3.3 调度监控

上图所示是SIA-TASK的调度监控页面,分着的一块一块区域属于不一样项目组。目前SIA-Task接入了51个项目,准备中的有500多个,正在运行的有25个。
有的Job执行很是快,几秒钟就执行完了,有的Job执行很是慢,须要很长的时间,咱们在状态抓取的时候,只能抓取到时间长的Job,这些被抓取的Job显示为正在运行,而时间短的捕捉不到,但它们都处于执行状态,这些没有被抓取到的Job就显示为准备中。
可能有的Job这段时间不须要运行,能够手动中止,剩下的就是异常中止的Job,须要发送邮件告警。
咱们也提供了检索的能力,能够接受不一样项目组登陆查询本身的项目运行状态。

3.4 Task管理

Task管理界面中,Task按项目组分组显示,主要提供Task的配置、修改与删除等功能。
Task包含两部分:
  • 一部分Task使用了sia-Task-hunter组件,经过标准注解实现Task的自动抓取,这类Task不容许修改;
  • 另一部分Task是由用户手动添加的,我知道访问的URL和HTTP地址,手动添加进来,这部分Task支持跨平台的抓取,并且能够修改和删除。
一个Task管理包含如下几个部份内容:项目名称、应用名称、任务名称、机器地址、描述、以及查看/修改/连通性测试等操做。同一个Task名称,不一样的机器地址,表明一个任务和不一样的任务实例。

3.5 Job管理

前面介绍了一个Job由若干个Task组成,图中每个不一样的列表明项目名称,点击下拉列表能够显示全部的项目,能够进行过滤、添加、状态查看等操做。
其中状态操做能够手工执行,能够中止或激活Job,Job配置好以后属于未激活的状态,须要激活一下。还能够修改Job里的信息,配置Job等。如何添加Job?假如我要添加一个Cron表达式类型的Job,须要添加哪些内容呢?
由于Job是Cron表达式类型的,首先我须要输入六位表达式内容,还要添加一个预警邮箱,再描述这个Job,每一个Job都有一个key,最后还须要添加Job_key。这样一个新的Job就添加好了。
回过头来看, 添加Job须要配置Task信息,这是一个比较复杂的过程。 一个Job由若干个Task组成,咱们能够用拖拉拽的方式根据Task之间的关系肯定造成组成Job的全部Task的顺序关系。还能够以不一样颜色表明不一样项目进行区分,固然只有管理员才有权限看到全部项目,各个项目的负责人只能看到本身所属项目的状态。
上传Task的时候会带一些参数,因此还涉及到参数的处理,好比参数类型、参数值、过时时间等。重点聊聊过时时间。
经过HTTP方式调用会遇到一个问题:到底Task什么时间会执行完成。 为解决这个问题,就须要设一个Task的过时时间,只要过时时间一到,就会转入其余策略,好比放弃或人工处理等。由于做为异步调用,不可能无休止地等待客户端返回结果。
固然也可能存在一种状况:我获得的结果是超时了,实际上任务是在正确执行,并且再过一段时间给我返回结果了。咱们曾经设计了一种队列补偿机制来处理这个问题,可是好像意义不大。固然,这只是一种可能,平台上线至今没有出现过。
目前 平台的Task_选取实例策略包括两种:
  • 随机,从可选的列表中,随机选择实例,即IP+端口; 
  • 固定IP,指定实例,随后须要从可选列表中人工指定实例。 
平台支持四种Task_调用失败策略: 
  • STOP,中止策略,调用失败则整个Job中止,再也不执行后续Task; 
  • IGNORE,忽略策略,调用失败则跳过该Task,继续执行后续Task; 
  • TRANSFER,转移策略,选取该Task的其余实例执行,若是依然失败,则使用中止策略; 
  • MULTI_CALLS_TRANSFER,屡次调用再转移策略,重复调用该Task屡次,若是依然失败,则使用转移策略。

3.6 调度日志

日志管理提供了Job的运行日志相关信息,按项目组分组显示,一条Job日志的关键元素包含:
  • 执行状态: 表示该Job执行结果; 
  • 执行时间 :表示调度器调度Job的时间; 
  • 执行完成时间: 表示Job执行完成的时间; 
  • 调度信息: 表示执行Job的调度器实例; 
  • 执行信息 :Job执行的具体信息,而且已实现Job与所引用的Task的执行日志信息的关联,日志默认保存七天。


4、开源

SIA-TASK做为SIA团队的一个重要产品,在公司接入了数十个项目,运行着数百个Job,经受住了稳定性的考验。
SIA-TASK微服务调度平台于5月已经开源,开源地址:https://github.com/siaorg/sia-Task, 感兴趣的同窗能够登陆查看详细介绍。
开源项目:
微服务任务调度框架 :https://github.com/siaorg/sia-task
微服务路由网关 :https://github.com/siaorg/sia-gateway



⭐️⭐️⭐️欢迎加入“SIA-TASK开源”。进群方式:请加小助手微信(微信号:creditease_tech)回复“SIA”。

◆ ◆ ◆ ◆ 

如需转载请与小助手(微信号:creditease_tech)联系。发现文章有错误、对内容有疑问,均可以经过关注宜信技术学院微信公众号(CE_TECH),在后台留言给咱们。咱们每周会挑选出一位热心小伙伴,送上一份精美的小礼品。快来扫码关注咱们吧! 

注:文章封面原图素材来源于网络,如有侵权请留言删除。

点击“阅读原文”查看更多技术干货


本文分享自微信公众号 - 宜信技术学院(CE_TECH)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索