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

114 阅读5分钟

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

抖音春节活动 & 定时任务发展之路

通过扫描脚本扫描集卡信息,汇总信息后,定时发送奖金。

春节活动技术挑战:用户规模太大、资金规模太大、读写规模太大。

春节活动技术诉求:自动化、定时执行、海量数据处理、高效稳定,即分布式定时任务。

windows批处理文件例子:利用bat让电脑10分钟后关机、利用此电脑定时打卡、利用time和ticker每5分钟刷新本地缓存。

利用bat让电脑10分钟后关机:bat文件内容shutdown -s -t 600

利用此电脑定时打卡:右键此电脑->管理->计算机管理(本地)->系统工具->任务计划程序->创建任务。

利用time和ticker每5分钟刷新本地缓存:

func main(){
    ticker:=time.NewTicker(5*time.Minute)
    for{
        select{
        case<-ticker.C:
            SvncLocalCache()
        }
    }
}

分布式定时任务的属性:平台化管理、分布式部署、能突破单机性能瓶颈、支持海量数据

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

分布式定时任务的定义:把分散的、可靠性差的定时任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式。

定时任务的定义:特定时间触发的任务。

延时任务的定义:延时触发的任务。

周期任务的定义:固定周期时间,或固定频率周期调度触发的任务。

单机任务的定义:随机触发一台机器执行任务。

广播任务的定义:广播到所有机器上执行同一任务。

Map任务的定义:一个任务可以分出多个子任务,每个子任务负责一部分的计算。

MapReduce任务的定义的定义:在Map任务的基础上,还可以对所有子任务的结果做汇总计算。

分布式定时任务的特点:自动化、平台化、分布式、伸缩性、高可用。

分布式定时任务框架:Xxl-job(美团-开源)、SchedulerX(阿里-不开源)、TCT(腾讯-不开源)、Elastic-job(当当-开源)、Saturn(唯品会-开源)。

分布式定时任务实现原理

分布式定时任务核心问题:触发、调度、执行。

触发器:解析任务,生成触发器。

调度器:分配任务,管理任务生命周期。

执行器:获取执行任务单元,执行任务逻辑。

控制台:提供任务管理和干预的功能。

数据流

控制台功能架构:原数据存储、元数据状态流转、任务分片、任务依赖、规则引擎、任务暂停/恢复、日志管理、监控报警、指标统计。

触发器功能架构:解析引擎、扫描器、可靠投递、状态流转、补偿策略。

调度器功能架构:调度、负载均衡、幂等控制、容错、故障转移、限流、计费、优雅启停、状态管控。

执行器功能架构:注册、任务获取、任务执行、状态上报、日志处理、本地幂等、任务回调。

任务:任务元数据。(核心)

任务实例:任务运行的一次实例。

任务结构:任务实例运行的结构。

任务历史:用户可以修改任务信息。

任务元数据:用户对任务属性定义,包括任务类型调度时机、执行行为等。

任务元数据构成:基础信息、调度时机、执行行为、执行方式。

任务实例构成:任务ID、触发事件、状态&结果、过程信息。

触发器核心职责:给定一系列任务,解析它们的触发规则,在规定时间点触发任务的调度。

触发器的难点:需要支持大量任务,需要支持秒级的调度,周期性任务需要多次执行,需要保证秒级扫描的高性能,并避免资源浪费。

触发器方案:定期扫描+延时信息、时间轮。

时间轮:一种高效利用线程资源进行批量化调度的一种调度模型,是一个存储环形队列,优于时间链表和时间最小堆,底层采用数组实现,数组中每个元素可以存放一个定时任务列表。

触发器的特点:存储上,不同国别、业务做资源隔离,运行上,不同国别、业务分开执行,部署时,采用多机房集群化部署,避免单点故障,通过数据库锁或分布式锁保证任务只被触发一次。

在触发调度前,尝试抢占分布式锁,可使用Redis锁或Zookeeper锁,可调高性能。

随机节点执行:选择集群中一个可用的执行节点执行调度任务。

广播执行:在集群中所有的执行节点分发调度任务并执行。

分片执行:按照用户自定义分片逻辑进行拆分,分发到集群中不同节点并行执行,提升资源利用效率。

故障转移:分片任务基于一致性hash策略分发任务,确保部分执行单元任务失败时,任务最终成功。

调度器可以集群部署,做到完全的无状态,靠信息队列的重试机制保障任务一定会被调度。

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