[02实践应用 - 分布式定时任务] 12 - 分布式定时任务 | 青训营笔记

48 阅读5分钟

这是我参与「第五届青训营」伴学笔记创作活动的第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:定时扫描 + 延时消息(腾讯、字节方案)

image.png

2.3.2 解决方案2:实践论(Quartz)

image.png

采用环形数据结构

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

image.png

基于注册中心实现执行器的弹性扩缩容。

3 业务应用

对于定时、延时、周期性任务都可以应用哪个分布式定时任务。从应用行业来说,包括电商(30分钟不支付交易关闭、定时消息)、互动(集五福、春节红包)、游戏。

3.1 能够实现相似任务的其它方式

未确认收货后的自动收货:分布式定时系统的延时任务、消息队列的延时消息或定时消息。

春节集卡活动统计完成用户数和翻倍数:分布式定时任务 MapReduce 任务、大数据离线处理引擎 HIVE、大数据实时处理引擎 Flink。

参考资料

juejin.cn/post/719632…