这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天
引例
每年春节前的集卡领红包类游戏如何设计技术方案?
集卡领红包类游戏主要分两部分:
- 年前定时扫描并计算各用户集卡完成度和预计红包金额,同时需汇总公司预计总支出;
- 年中定时开奖并发放红包奖励;
技术设计点主要指向分布式定时任务,需要考虑的难点包括:
- 自动化
- 定时执行
- 海量数据处理
- 稳定执行
定时任务发展历程
-
单机定时任务
- Timer、Ticker:跨平台,仅单机可用
- ScheduledExecutorService:拥有线程池处理 ,仅单机可用
-
任务调度式定时任务框架
- Quartz:单机任务更优性能,无负载均衡,无分布式并行处理
-
分布式定时任务框架
分布式定时任务框架支持定时任务平台化管理,分布式部署和海量数据处理;分布式定时任务是把分散的、可靠性差的定时任务纳入统一的平台, 并实现集群管理调度和分布式部署的一种定时任务的管理方式。
- 触发时机分类
- 定时任务:指定在T时间执行
- 延时任务:一次执行完成后,隔T时间后再次触发执行
- 周期任务:分隔T时间触发执行一次
- 分布式定时任务特定
- 自动化:全自动完成定时任务的调度和执行
- 平台化:基于平台化的思维管控一系列的分布式定时任务
- 分布式:在分布式系统环境下运行任务调度,突破单机定时任务的性能瓶颈
- 伸缩性:采用集群方式部署,可以随时按需扩缩容
- 高可用:单点故障不影响最终任务结果,可以做到故障转移
- 分布式定时任务执行方式
- 单机任务:随机触发一台机器执行任务, 适用于计算量小、并发度低的任务(R1 --> C1)
- 广播任务:广播到所有机器上执行同一个任务,比如所有机器一起清理日志(R1 --> C1, C2, C3....Cn)
- Map任务:一个任务可以分出多个子任务,每个子任务负责一部分的计算。 适用于计算量大,单机无法满足要求的任务(R --> R1, R2, R3, R4 ---> C1, C2, C3, C4)
- MapReduce任务:在Map任务的基础上,还可以对所有子任务的结果做汇总计算,适用于计算量大,并且需要对子任务结果做汇总的任务(R --> R1, R2, R3, R4 ---> C1, C2, C3, C4 --> R)
- 分布式定时任务框架
- Xxl-job:开源免费,推荐
- SchedulerX
- TCT
- Elastic-job
- Saturn
- 触发时机分类
分布式定时任务实现原理
- 业务模型
- 任务(Job):任务元数据,定义任务属性,包括调度时机,执行频率
- 任务实例(JobInstance): 周期任务会生成多个任务实例
- 任务结果(JobResult):任务实例运行的结果
- 任务历史(JobHistory):用户可以修改任务信息,任务实例对应的任务元数据可以不同,因而使用任务历史存储
- 核心架构
- 触发器(Trigger):负责解析任务,生成触发事件;通过分布式锁提高可用性
- 定期扫描+消息队列延时处理
- 时间轮遍历
- 调度器(Scheduler):负责任务分配,管理任务生命周期
- 随机调度执行
- 广播执行
- 分片执行
- 执行器(Execute):负责执行任务逻辑
- 基于注册中心,可以做到执行器的弹性拓展
- 回调
- 心跳检测
- 控制台(Admin):提供管理和干预功能
- 触发器(Trigger):负责解析任务,生成触发事件;通过分布式锁提高可用性