这是我参与「第五届青训营」伴学笔记创作活动的第12天。今天的内容是关于分布式定时系统的。在当下,人们对分布式定时系统的要求主要包括自动化、定时执行、能够面向海量数据、高效稳定。
1 发展历程
Windows 批处理(自动关机系统) -> Windows 任务计划程序 -> Linux 命令 CronJob -> 单机定时任务 python: Timer、go: Ticker (跨平台、但单机使用) -> 单机定时任务 ScheduleExecutorService (有线程池、但单机使用) -> 任务调度 Quartz (单任务极致控制、没有负载均衡机制) -> 分布式定时任务(平台化管理、分布式部署、支持海量数据)
1.1 分布式定时任务
定时任务的定义:定时任务是指系统为了自动完成特定任务,实时、延时、周期性完成任务调度的过程。
分布式定时任务的定义:分布式定时任务是把分散的、可靠性差的定时任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式。
分布式特点:自动化、平台化、分布式、伸缩性、高可用
按照触发时间可以分为:定时任务、延时任务和周期任务
按照执行方式可以分为:单机任务(随机触发一台机器执行,计算量小,并发度低)、广播任务(所有机器执行)、Map 任务(拆分子任务分别计算)、Map-Reduce 任务(拆分任务计算后汇总计算)
1.2 工业场景下分布式定时任务框架
XxL-job
美团使用,开源且免费,轻量级
Scheduler
阿里使用,不开源
TCT
腾讯使用,不开源,未对外商用
1.3 相关技术:
分布式定时任务 和 单机定时任务
都可以实现自动化的定时、延时、周期性任务调度。
分布式定时任务能支持更大的业务体量,伸缩性、稳定性更好。
分布式定时任务 和 大数据处理引擎
都可以对海量数据进行处理,性能、伸缩性、稳定性都很高。
定时并不是大数据处理的核心任务,更侧重数据结构。分布式定时任务还可以完成一些业务逻辑处理,调用一些 HTTP 或 RPC 任务。
2 实现原理
分布式定时任务要解决的核心的3个问题就是触发、调度和执行。
2.1 核心架构
Tigger 触发器(解析任务) + Scheduler 调度器(分配任务) + Executer 执行器(执行任务)
此外还有一个 Admin 控制台用于面向以上3种结构提供任务管理和干预。
2.2 控制台 Admin
定义
- 任务 Job:任务元数据
- 任务实例 JobInstance:任务运行的实例
- 任务结果 JobResults:任务运行结果(重试会产生多个结果)
- 任务历史 JobHistory:用户可以修改的任务信息
1 - n 关系:Job - JobInstance, JobInstance - JobResults, Job - JobHistory
任务元数据 Job 是用户对任务属性的定义,包含基础信息(名字、属于什么业务)、调度时机、执行行为、执行方式。
任务实例 JobInstance 是一个确定的 Job 的一次运行实例,包含 Job_id、触发时间、状态和结果、过程信息。
2.3 触发器 Tigger
核心职责:给定一系列任务,解析它们的触发规则,并在规定的时间点触发任务调度。
设计约束:支持大量任务、支持秒级调度、周期任务需要多次执行、支持秒级的高性能扫描避免资源浪费。
2.3.1 解决方案1:定时扫描 + 延时消息(腾讯、字节方案)
2.3.2 解决方案2:实践论(Quartz)
采用环形数据结构
2.3.3 触发器的高可用性
核心问题:不同任务间的任务调度相互影响、负责扫描和触发的机器宕机怎么办。
解法思路:存储上根据国家业务进行隔离,运行时根据国家业务进行隔离,部署时采用多机房集群部署。
数据库行锁模式
在触发调度之前,更新数据库中 JobInstance 的状态,成功抢锁的才会触发调度。
缺点:节点多时会导致性能降低。
分布式锁模式
在触发调度之前,尝试抢占分布式锁,如 Redis 锁和 ZooKeeper 锁。
2.4 调度器 Scheduler
核心问题:资源来源、资源调度、任务执行。
资源来源分为任务系统和定时任务平台。任务系统提供的资源由于执行逻辑和业务系统共用一份资源,资源利用率更高;但更容易出现定时任务脚本影响在线任务的情况,且不能由定时任务平台控制扩缩容。定时任务平台提供的资源可以实现任务执行逻辑和业务系统分离、可以优雅地实现扩缩容;但要消耗更多机器资源、额外为定时任务平台申请接口调用权限。
资源调度:
- 节点选择:随机节点执行(随机选择1个节点)、广播执行(批量任务)、分片执行(任务拆分后分配任务)
- 任务分片:假设有 N 个执行器,将任务分为 M 个业务数据区段(最好 M >= N, 且 M 是 N 的整数倍)
- 任务编排:使用有向无环图(DAG)进行可视化任务关系定义
- 故障转移:分片任务基于一致性 hash 策略分发任务,当某 Executer 发生故障时 Scheduler 会将任务重新进行 hash 计算发给其它 Executer。
- 高可用:调度器可以集群部署,做到完全的无状态。
2.5 执行器 Executer
基于注册中心实现执行器的弹性扩缩容。
3 业务应用
对于定时、延时、周期性任务都可以应用哪个分布式定时任务。从应用行业来说,包括电商(30分钟不支付交易关闭、定时消息)、互动(集五福、春节红包)、游戏。
3.1 能够实现相似任务的其它方式
未确认收货后的自动收货:分布式定时系统的延时任务、消息队列的延时消息或定时消息。
春节集卡活动统计完成用户数和翻倍数:分布式定时任务 MapReduce 任务、大数据离线处理引擎 HIVE、大数据实时处理引擎 Flink。