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

134 阅读5分钟

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

本文是对于掘金课程的课程笔记,针对课程内容的一些重难点、本人在学习分布式定时任务知识时候进行的简单记录。

一、本堂课的重点内容

  1. 前言
  2. 任务发展历程
  3. 实现原理
  4. 业务应用

二、详细知识点介绍

前言

春节集卡瓜分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,也知道时间轮算法,但是并不知道他们对应的知识点,也不知道分布式定时任务的架构如何,内部重点概念是什么。通过本次课程,我对于分布式定时任务有了系统的、细节的掌握,对于各种应用场景实例也有了了解。