内容来源:宜信技术学院第4期技术沙龙-线上直播|宜信微服务任务调度平台建设实践html
主讲人介绍git
梁鑫:宜信高级架构师&开发平台负责人 github
本文字数:7693字web
导读:现在,不管是互联网应用仍是企业级应用,都充斥着大量的批处理任务,经常须要一些任务调度系统帮助咱们解决问题。随着微服务化架构的逐步演进,单体架构逐渐演变为分布式、微服务架构。微信
在此背景下,不少以前的任务调度平台已经不能知足业务系统的需求,因而出现了一些基于分布式的任务调度平台。这些平台各有其特色,但也各有不足之处,好比不支持任务编排、与业务高耦合、不支持跨平台等问题,不是很是符合公司的需求,所以咱们开发了微服务任务调度平台(SIA-TASK)。本次分享主要围绕SIA平台展开,包括研发背景设计思路和技术架构,以及如何支持业务方。网络
分享大纲:多线程
1、SIA-TASK的产生(背景、问题等)架构
2、SIA-TASK的核心设计思想(组成、运行、特性、关键点等)并发
3、SIA-TASK组成模块(调度器管理、监控、日志等)app
4、开源
如下为直播视频,可点击回放,时长43m42s,建议在WiFi环境下观看。
分享实录
1.1 背景
1.2 种类
飞机型是指每一年/月/周/天固定某一时刻执行的任务。这种任务在咱们的业务系统中很是常见,好比天天1点要执行一个跑批任务去清理前一天的日志;每个月10号要给公司全员发工资,这些都属于飞机型任务。
地铁型是指每隔固定时间执行任务,不可并发。咱们也常常遇到这样的批处理任务,第一个任务没有结束,第二个任务是不能够执行的,这就是不可并发。
公共汽车型是指每隔固定时间执行任务,可并发。若是是公共汽车型的任务,前一个任务没有结束,下一个任务也能够按点开始执行。
1.3 问题
遗忘,忘记了还在运行的定时任务。在咱们公司发生过一个这样的案例,若干年前的一个冬天,咱们的一个项目团队用3个月的时间作了一个项目,运行一段时间后发现项目的效果并非很理想,便将相关的程序都停掉了,却忘了有一个跑批任务的节点还在继续运行,直到两年后,这个节点产生的日志把磁盘填满了,触发了监控报警,咱们才发现。
单点,就是没有热备,跑批任务是一个单点运行的定时任务,出了故障须要转入手工处理。
依赖,利用时间差来处理依赖反复形成问题数据。你们知道项目有的时候是须要有依赖关系的。好比某个项目的跑批流程A和跑批流程B存在前后次序,项目组设置跑批流程A在凌晨2点运行,跑批流程B在凌晨4点运行,从时间上保证前后次序,万一跑批流程A执行时间过长,超过2小时,就会致使数据出现问题,须要手工处理出现问题的数据。
1.4 关系
串行,存在前后关系的两个任务。即任务B在任务A后执行,要先执行任务A以后再执行任务B。
并行,能够并发执行的两个任务。好比任务B和C都要在任务A以后执行,而任务A执行完成后,任务B和C能够同时执行,那B和C就是并行关系。
分支,根据前置任务的返回结果进行判断,不一样的结果执行不一样的后续任务。好比返回0的时候,执行任务A,返回1的时候执行任务B,这是一种分支的状况。
1.5 思考
平台化。项目团队老是但愿把更多的精力投入到业务开发中,但愿把其它与业务开发无关的事情尽量地放到架构团队。他们但愿有一个执行任务的平台,仅仅须要把编写好的业务逻辑放到这个平台就能够了,这个平台会完成全部的工做,项目组只须要关心业务逻辑。
微服务。为了更好地知足项目的需求,咱们但愿能把任务的业务逻辑和任务的编排调度区隔开来,采用注册和发现机制来建设任务调度平台,与业务相关的部分交给项目团队处理,把其余的部分交给任务平台来处理。
1.6 因素
任务编排。多个业务之间的定时任务存在流程次序,前面提到任务之间有并行的关系、有串行的关系,还有分支的关系,咱们但愿平台能有相应的编排功能去处理和支持这些任务。
任务分片。对于一个大型任务,须要分片并行执行。
跨平台。除了使用 Java 技术栈(SpringBoot、Spring等)的项目以外,还要可以支持使用其余语言的应用。
无侵入。业务不但愿与调度高耦合,只关注业务的执行逻辑,但愿平台对业务自己代码是无侵入的,将影响降到最低。
高可用/故障转移。调度系统自身必须保证高可用,不能有单点,任务执行过程当中遇到问题有补偿措施,可以平滑处理,减小人工介入。
可视化。任务调度的操做提供可视化页面,方便使用。
实时监控。平台要有实时监控系统,实时获取任务的执行状态。
动态编辑。业务的任务时钟参数可能变更,在可视化的基础上,对全部任务执行的操做都实时反映到业务系统中去,不须要停机部署。
2.1 简介
2.2 术语
-
任务(Task) : 基本执行单元,执行器对外暴露的一个HTTP调用接口; -
做业(Job) : 由一个或者多个存在相互逻辑关系(串行/并行)的任务组成,任务调度中心调度的最小单位; -
计划(Plan) : 由若干个顺序执行的做业组成,每一个做业都有本身的执行周期,计划没有执行周期; -
任务调度中心(Scheduler) : 根据每一个的做业的执行周期进行调度,即按照计划、做业、任务的逻辑进行HTTP请求,它是一个单独的节点; -
任务编排中心(Config) : 编排中心使用任务来建立计划和做业; -
任务执行器(Executer) : 接收HTTP请求进行业务逻辑的执行; -
Hunter: Spring项目扩展包,负责执行器中的任务抓取,上传注册中心,业务可依赖该组件进行Task编写。
Job、Task、Plan的关系
2.3 组成

-
任务执行器 ,就是你的业务代码在哪里,这是属于项目组的。 -
任务注册中心 ,咱们用的是ZooKeeper。 -
任务编排中心 -
持久存储 ,咱们用的是MySQL。 -
任务调度中心
2.4 运行
2.5 特性
1)基于注解自动抓取任务
2)基于注解无侵入多线程控制
3)高度灵活任务编排模式
4)调度器自适应任务分配
2.6 关键点
-
任务流 。实现任务与任务之间可配置的流向关系,造成有向无环图(DAG)。任务流可由定时时间(Cron 表达式)或外部请求(提供 API 地址) 开始,根据 DAG 逻辑执行。 -
元数据管理 。微服务中各个任务元数据的管理同步数据抓取、录入。 -
智能运维。 可视化的任务实时监控,全部监控都是有页面能够看到的;实时预警机制,出现问题的时候,会发送邮件或短信给相关人员告警;半智能化的自主修复,嗅探重试,不须要人工干预。 -
资源隔离。 进程间的资源隔离;进程内的资源隔离,提升系统吞吐,提供稳定性。时钟用的是Core Schedule,一个调度中心对一个项目组用一个Core Schedule,每一个项目组在同一个调度的时候,同一个调度器上都是隔离的,一个项目组出问题,不会影响到其余的项目组,这就至关于表明了隔离性负载均衡。 -
负载均衡。 调度中心调度任务的时候,任务的执行周期时间不同,可能有的任务须要的时间长一点,有的任务须要的时间短一点,调度器的资源也不太同样,有的CPU高一点,有的CPU低一点,那如何保证调度负载均衡?如何保证资源隔离的负载均衡?咱们会根据这种任务调度的历史值(任务耗时)以及机器自己性能的值进行考量,使每个任务调度中心拥有的调度数量差很少、消耗也差很少。这是一种新的负载,而不是简单的流量负载。
3.1 首页
-
调度器信息:调度中心调度器的数量。 -
调度次数:调度中心调度Job的历史累计总数。 -
对接项目详情:调度中心对接的项目组总数,Job总数。
-
Job上限值: 所能负载的Job动态阈值; -
Job运行数量: 该调度器当前运行的Job数量; -
Job预警值: 当调度器运行的Job数超过预警值时,会发邮件通知管理员。
3.2 调度器管理

-
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 调度监控

3.4 Task管理
-
一部分Task使用了sia-Task-hunter组件,经过标准注解实现Task的自动抓取,这类Task不容许修改; -
另一部分Task是由用户手动添加的,我知道访问的URL和HTTP地址,手动添加进来,这部分Task支持跨平台的抓取,并且能够修改和删除。
3.5 Job管理

-
随机,从可选的列表中,随机选择实例,即IP+端口; -
固定IP,指定实例,随后须要从可选列表中人工指定实例。
-
STOP,中止策略,调用失败则整个Job中止,再也不执行后续Task; -
IGNORE,忽略策略,调用失败则跳过该Task,继续执行后续Task; -
TRANSFER,转移策略,选取该Task的其余实例执行,若是依然失败,则使用中止策略; -
MULTI_CALLS_TRANSFER,屡次调用再转移策略,重复调用该Task屡次,若是依然失败,则使用转移策略。
3.6 调度日志
-
执行状态: 表示该Job执行结果; -
执行时间 :表示调度器调度Job的时间; -
执行完成时间: 表示Job执行完成的时间; -
调度信息: 表示执行Job的调度器实例; -
执行信息 :Job执行的具体信息,而且已实现Job与所引用的Task的执行日志信息的关联,日志默认保存七天。
⭐️⭐️⭐️欢迎加入“SIA-TASK开源群”。进群方式:请加小助手微信(微信号:creditease_tech)回复“SIA”。
◆ ◆ ◆ ◆ ◆
如需转载请与小助手(微信号:creditease_tech)联系。发现文章有错误、对内容有疑问,均可以经过关注宜信技术学院微信公众号(CE_TECH),在后台留言给咱们。咱们每周会挑选出一位热心小伙伴,送上一份精美的小礼品。快来扫码关注咱们吧!
注:文章封面原图素材来源于网络,如有侵权请留言删除。
⏬点击“阅读原文”查看更多技术干货
本文分享自微信公众号 - 宜信技术学院(CE_TECH)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。