分布式定时任务 | 青训营笔记

83 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天

主要内容

本节课程主要学习了分布式任务的相关概念,包括定时任务的概念、分类,分布式定时任务的实现原理,以及其在实际业务中的使用。

详细内容

分布式任务基本概念

发展历史: 有windows批处理、Linux的cronjob、单机定时任务的Timer和Ticker、单机定时任务ScheduledExecutorService、任务调度的Quartz等。

定时任务定义:系统为了自动完成特定任务,定时、延时、周期性地完成任务调度的过程

定时任务按不同的有不同的分类方式。按触发机制有定时任务、延时任务和周期任务。按执行方式有单机、广播、map和mapreduce。

  • 定时任务:顾名思义,在某个特定时间
  • 延时任务:延迟多少多少时间后启动
  • 周期任务:固定周期或者频率触发,如每天12点执行或者每隔3s执行
  • 单机任务:随机触发一台机器执行任务
  • 广播任务:广播到所有机器上执行同一个任务
  • Map任务:将一个大任务拆分成多个小任务,每个子任务负责一部分的计算
  • MapReduce任务:Map任务执行后,再对结果进行汇总

目前定时任务有很多框架,如美团的Xxl-job、阿里的SchedulerX、腾讯的TCT等,据老师讲,字节内部同时在用着好多框架。

分布式定时任务与单机定时任务、大数据处理引擎的对比: 分布式定时任务与单机定时任务都能实现自动化的定时、延时、周期任务调度,但是分布式定时任务的承载能力更强,能支撑更大的业务体量,性能、稳定性更高。 分布式定时任务与大数据处理引擎都能对海量的数据进行处理,但两者的侧重点不同,大数据处理引擎往往需要将源数据处理成结果数据,且不需要解决定时这个问题,而分布式定时任务既要处理数据,还可以调用HTTP和RPC服务。

实现原理

分布式定时任务主要由Tigger(触发器)、Scheduler(调度器)、Executor(执行器)、Admin(控制台)四部分组成。
触发器用来解析任务、生成触发事件,调度器用来分配任务、管理任务的生命周期,执行器用来获取执行任务单元并执行任务逻辑,控制台提供任务管理和干预的功能。

控制台

主要通过ER图了解了Job、JobInstance、JobResult和JobHistory之间的关系以及各自的概念。
Job(任务元数据):是用户对任务属性的定义,包含了基础信息、调度时机、执行行为、执行方式四部分,正好对应了Who,When,What,How。
JobInstance(任务实例):是一个确定的Job的一次运行实例。其包含了Job_id、触发事件、状态&结果、过程信息。
JobResult(任务实例运行的结果 JobHistory(任务历史)
Job与JobInstance是一对n的关系,因为一个Job可能运行多次,从而有多个JobInstance。

触发器

触发器的核心职责是在规定的时间点触发任务的调度。因此在设计时要保证其能支持大量的任务、且在保证高性能的同时避免资源的浪费。
课上讲到了两种触发器方案。一种是定期扫描+延时消息(腾讯、字节的方案),一种是时间轮(Quartz的方案)。并且了解了其各自的实现原理。
其设计时的核心问题是避免不同业务不同任务的调度间互相影响。因此在设计时,存储上做资源隔离,运行时将不同的业务分开执行,部署时,采用多机房集群化部署并采用数据库锁或分布式锁。
为了保证调度器的高可用,可以采用Trigger集群模式、数据库的行锁、分布式锁(Redis或ZooKeeper实现)。

调度器

主要讲了资源来源、资源调度和任务执行三块。
资源来源 :目前有两种方案,分别是业务系统提供机器资源和定时任务平台提供机器资源。 业务系统提供机器资源目前阿里、美团、字节等公司在使用,其优点使资源利用率更高,缺点是更容易发生定时任务脚本影响在线服务的事故;定时任务平台提供机器资源目前字节等公司在使用,优点就是能够避免任务脚本对在线服务的影响,同时支持优雅地扩缩容,缺点是消耗更多机器资源,且需要额外申请接口。

资源调度: 在节点选择上,可以选择的有随机节点执行(任选一个集群中的可用节点)、广播执行(集群中所有节点执行)和分片执行(按用户自定义逻辑拆分然后在不同节点中执行)。也可以通过任务分片的方式进行,可以提高任务执行的效率以及资源的利用率。此外还可以进行任务编排和故障转移,这两个属于高级特性。

执行器

主要是基于注册中心,可以做到执行器的弹性扩缩容。

业务应用

在需要用到定时、延时、周期性执行任务的业务场景,都可以考虑分布式定时任务。如电商(逾期未付款自动取消订单)、互动(支付宝集五福、字节的集卡)、游戏(活动后批量补发用户未领取的奖励、定期更新榜单)。
除了使用分布式定时任务来实现外,还可以用消息队列的延时消息或定时消息(例如超过一定时间自动确认收货)、Hive、Flink(集卡活动等)

总结

经过本节课的学习,重点是了解了定时任务的发展历程,以及实现原理,尤其是其各个组成部分,并且了解了其在实际业务中的使用。