这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
本文是对于掘金课程的课程笔记,针对课程内容的一些重难点、本人在学习分布式定时任务知识时候进行的简单记录。
一、本堂课的重点内容
- 前言
- 任务发展历程
- 实现原理
- 业务应用
二、详细知识点介绍
前言
春节集卡瓜分20亿
流程:抽卡->集齐->开奖
后端开发同学,如何设计最终开奖环节的技术方案?
- 发奖金额计算:扫描脚本,扫描集卡信息,计算发奖金额
- 定时开奖
规模:亿级用户规模与资金规模,百万级QPS
要求:自动化+当时执行+海量数据+高效稳定=分布式定时任务
任务发展流程
- Case1:10分钟后windows电脑自动关机
- Case2:每天12点自动疫情打卡
- Case3:每天2:30定时清理机器日志。linux命令-cronjob
- Case4:每隔五分钟定时刷新本地缓存数据(单机定时任务,Timer,Ticker)
- Case5:每隔五分钟定时执行多个任务(ScheduledExecutorService)
- 任务调度:Quartz(没有负载均衡机制,但是不算真正的分布式定时任务,对单任务极致控制)
用一万台机器来实现春节任务,但是如何协调?
使用分布式定时任务
优点:
- 平台化管理
- 分布式部署
- 支持海量数据
什么是分布式定时任务?
- 定时任务:系统为了自动完成特定任务,实时、延时、周期性完成任务调度的过程
- 分布式定时任务:把分散的、可靠性差的定时任务纳入统一的平台,实现集群管理调度和分布式部署的一种定时任务的管理方式
分布式定时任务分类
- 定时任务
- 延时任务
- 周期任务
按照执行方式分类
- 单机任务
- 广播任务
- Map任务
- MapReduce任务
对于春节集卡活动,就可以采用MapReduce任务(计算发奖金额)+Map任务(发奖)
主流的框架:xxl-job(美团);SchedulerX2.0(阿里);TCT(腾讯)
实现原理
核心架构
触发、调度、执行
- 执行器:Trigger,解析任务,生成触发事件
- 调度器:Scheduler,分配任务,管理任务生命周期
- 执行器:Executor,获取执行任务单元,执行任务逻辑
- 控制台:Admin,提供任务管理和干预的功能
数据流
- 任务创建:任务基础信息+触发规则(周期性?周期为多少等)+任务代码->Admin(放到任务DB)
- 任务执行:使用触发器,调度器,执行器来执行
控制台
基本概念
- 任务元数据:是用户对任务属性定义,基础信息、调度时机、执行行为、执行方式
- 任务实例:是一个确定的job的一次运行实例,job_id、触发时间、状态&结果、过程信息
触发器
核心职责:给定任务,解析触发规则,在规定时间点触发任务的调度
方案:
- 定期扫描+延时消息(腾讯、字节方案)
- 时间轮(Quartz)
高可用
核心问题:不同业务、任务调度相互影响?负责扫描和触发的机器挂了怎么办?
思路:
- 存储上,不同国别、业务做资源隔离
- 运行时,不同国别、业务分开执行
- 部署时,采用多机房集群化部署,避免单点故障,通过数据库锁或者分布式保证任务只触发一次
方案:
- 数据库行锁模式(缺点明显,如果多台机器抢锁,节点越多性能越差)
- 分布式锁方式:在触发调度前,尝试抢占分布式锁,可使用redis锁或者zookeeper锁(性能高,较多使用)
调度器
- 资源来源
- 资源调度
- 任务执行
方案:
- 业务系统提供机器资源
- 定时任务平台提供机器资源
资源调度-节点选择
- 随机节点执行(定时对账)
- 广播执行(批量运维,所有机器清理日志)
- 分片执行(海量日志统计)
高可用
调度器可以集群部署,做到完全的无状态,靠消息队列的重试机制保障任务一定会被调度
执行器
基于注册中心,可以做到执行器的弹性扩缩容
业务应用
所有需要定时、延时、周期性执行任务的业务场景,都可以考虑使用分布式定时任务
- 电商(订单30分钟未付款自动关闭)
- 互动(支付宝集五福,瓜分红包)
- 游戏(定期更新游戏排行榜,活动后批量发放用户未领取奖励)
其他解决方案:
- 发货后超过10天未收货自动收货:分布式定时任务延时任务;消息队列的延时消息或者定时消息
三、课后个人总结
在课前其实我对分布式定时任务也有一定的了解,但是没有一个系统的掌握,我之前可能知道xxl-job,也知道时间轮算法,但是并不知道他们对应的知识点,也不知道分布式定时任务的架构如何,内部重点概念是什么。通过本次课程,我对于分布式定时任务有了系统的、细节的掌握,对于各种应用场景实例也有了了解。