写点什么

探寻繁杂定时任务的解决方案:分布式任务调度系统

  • 2020-05-21
  • 本文字数:3129 字

    阅读完需:约 10 分钟

探寻繁杂定时任务的解决方案:分布式任务调度系统

导语:本文我们从架构和技术实现上来为大家讲解腾讯云分布式任务调度系统 TCT(Tencent Cloud Task)如何实现任务调度的精准实时、稳定高效,以及任务的切分和编排。(编辑:中间件小 Q 妹)

背景介绍

缘起缘灭,自有因果


首先,我们来思考一些几个业务场景:


  • XX 信用卡中心,每月 28 日凌晨 1:00 到 3:00 需要完成全网用户当月的费用清单的生成。

  • XX 服饰,需要每天上午 9:00 开始向会员推送送生日祝福短信。

  • XX 游戏平台,新用户注册后,需要为当前用户生成定时任务,在月底清算虚拟货币兑换的佣金额度。

  • XX 公司,需要定时执行 Python 脚本,清理掉某文件服务系统中无效的 tmp 文件。

  • XX 保险公司,需要每天凌晨 2:00 统计前一天新增保单数量,并触发报表生成任务,完成后抄送邮件。


类似上述批量处理海量定时任务的业务场景,在企业从单体架构向微服务架构、云化服务架构演进过程中已经屡见不鲜,基于 Quartz 的常规调度框架无法应对这种分布式场景下的需求,既无法实现任务调度的精准实时、稳定高效,也无法实现任务的切分、编排、失败补充。因此企业迫切需要一款一站式分布式调度任务解决方案,帮助企业统一管理繁杂纷乱的定时任务,增强企业微服平台服务化能力,支撑企业云化服务转型。

现有的开源方案

它山之石可以攻玉 …


在过往的发展中,前人留下了不少优秀的方案,各有利弊。常见开源产品: Quartz、XXL-Job、ElasticJob、Antares、SIA-TASK 等。


  • Quartz:该框架应用最为广泛,其完全基于 Java 实现,Quartz 对单个任务的控制基本做到了极致,以其强大功能和应用灵活性,成为开源任务调度领域的权威及同类开源产品如 Antares 的基石;

  • XXL-JOB:一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。XXL-JOB 支持分片,支持简单任务依赖,支持子任务依赖,不支持跨平台的。

  • Elastic-Job:支持任务分片(作业分片一致性),没有任务编排,不支持跨平台;

  • SIA-TASK:具有跨平台、可编排、高可用、无侵入、一致性、异步并行、动态扩展、实时监控等特点。



开源方案的逻辑架构图



开源方案的技术实现图


从开源方案的逻辑架构和技术实现上,我们也能直观的看出开源方案的不足:


  • 架构方面:调度器职责划分不清晰、系统扩展性不足。面对大规模虚拟化 &复杂的网络环境,简单的远程调用并不能完成胜任。

  • 性能方面:ZooKeeper 集群伴随任务量和高频事件的增多,成为系统性能瓶颈。简单的远程调用或者轮训拉取等方案,满足不了量大频高的业务诉求。

  • 功能方面:缺乏完整认证鉴权方面的系统设计,安全性无法保障。任务干预、监控告警等系统运维方面能力较弱。

TCT 简介

为了解决上述问题,我们进行了深入的探索,并设计出了一套企业级的分布式任务调度系统 TCT(Tencent Cloud Task)。TCT 提供一站式分布式调度任务解决方案,支持随机、广播多种任务类型,具备任务分片、任务编排能力,提供完善的监控告警体系。我们结合了用户实际的业务场景,吸取了历史经验,主要解决了面几个核心问题:



以上核心要素,对系统的要求各不相同,可提供如下总结进行参考:


核心要素功能说明系统特性
任务触发解析并计算任务的触发时点,生成触发事件CPU密集型
任务调度承担任务派发规则,管理任务运行生命周期IO密集型
任务触达承担任务事件的触达和获取,管理任务执行信息的获取管道网络IO型
任务执行任务执行单元,执行真实的业务逻辑取决于业务场景

技术架构

架构,总是在需求中不断演进…



技术架构图


下面我们解释下架构图中的各个功能模块:


功能模块描述说明
管控器(Admin)用户控制台,提供任务管理和干预界面,配置任务运维指标等
触发器(Trigger)解析任务,生成触发事件
调度器(Scheduler)分配任务,管理任务运行生命周期
接入网关(AGW)认证鉴权,回话管理,任务信息透传等
SDK / Agent获取任务执行单元,执行任务逻辑

功能架构


功能架构图


这样设计分布式任务调度系统,有以下几个优点:

优点一:模块化微服务架构设计,职责清晰

触发器

  • 根据任务执行规则,计算解析出不同时点的任务触发事件。通过 MQ 的实现触发和调度的解耦,提高吞吐。

  • 通过合理的分片策略和容灾策略,解决传统多节点锁竞争轮训的解析加载策略,降低对存储的压力。

  • 冷热数据隔离加载机制,进一步降低对存储压力和系统开销。

  • 针对不同的触发频次,采取预加载策略和动态调整预加载算法,解决高频触发导致系统负载高的问题。

调度器

  • 整个任务调度系统中控制逻辑最为复杂的组件,IO 密集型组件。

  • 通过订阅 MQ 消息事件,与触发器解耦,有效提升系统的吞吐。

  • 专注于任务调度的逻辑控制,如任务执行调度、负载均衡、容错、限流、计费等。

接入网关

  • 独立承担客户端的接入认证和鉴权,提供有效的权限校验策略。

  • 负责上下行信道的回话管理,与复杂的业务逻辑完成解耦。

  • 客户端节点及服务节点上下线自动探测感知机制,有效实现会话管理。

  • 集群节点组网,数据透传及路由,实现组件内闭环。

  • 配合 SDK/Agent 侧设计,有效避免了单节点连接数瓶颈以及服务节点冷起场景下的高并发 tcp 建立连接问题。

优点二:无状态化设计,简便水平扩展

触发器

通过有效的分片策略和优雅停服策略,避免触发压力集中化,实现服务的水平扩缩性。

调度器

无状态的设计方案,无需考虑任务的回源问题,实现无状态的水平扩容。

接入网关

集群节点组网的设计方案,支持水平扩容,实现理论上 TCP 连接数无上限。

优点三:功能完备

灵活的触发规则

  • 支持 Cron 表达式,例如 * 0/5 * * * ? 等。

  • 特定周期频率的触发规则,例如 间隔 36 分钟等。


便捷的管理能力,提供暂停、恢复、停止、重试等多种多样的管控能力。




任务管理

支持三种执行方式

  • 随机节点执行:选择集群中一个可用的执行节点执行调度任务。适用场景:定时对账。

  • 广播执行:在集群中所有的执行节点分发调度任务并执行。适用场景:批量运维。

  • 分片执行:按照用户自定义分片逻辑进行拆分,分发到集群中不同节点并行执行,提升资源利用效率。适用场景:海量日志统计。



任务调度执行方式

支持三种触发方式

  • 手动触发:用户在任务管理列表选择特定任务手动执行一次,调度器立即进行任务分发,并产生一个执行批次。适用场景:周期执行任务补充。

  • 周期触发:通过设置任务触发的间隔时间来设置任务的执行时间;可支持 cron 表达式所不支持的周期设置。适用场景:定时备份。

  • 工作流触发:工作流是一组任务集合,可以编排任务的上下游逻辑依赖,进行任务触发。适用场景:海量数据处理,如数据采集,数据过滤,数据清洗,数据聚合的流程编排。



任务触发方式

日志溯源能力

通过日志服务,方便用户查询任务执行日志。用户可以通过执行记录所有任务的执行批次详情,能够对当前状态为执行中的批次进行停止执行操作,能够对当前已经终止的批次触发重新执行操作;点击批次 ID 进入该批次的执行详情,点击任务 ID 进入该任务的执行批次列表,点击执行部署组进入资源详情列表。



日志查询

支持复杂的任务编排能力

可以实现多种场景的任务工作流。通过构建调度任务的上下游依赖关系完成复杂的任务调度逻辑。适用于大数据流程处理、任务执行工单、批量运维流程编排等应用场景。



任务编排

总结

一个平台性的系统,从产品功能到技术架构都存在着方方面面的挑战,需要层层抽象和逐步优化才能完成一个成熟产品落地。在大数据时代,面对海量的数据和用户规模,任何一种架构设计,都面临着网络响应、容错、幂等、数据可靠性/一致性等诸多问题。


对于平台而言,任务的可靠性是第一优先级需要考虑的,次之任务执行的时效性。合理地进行功能模块化拆分,针对不同场景,设计不同的扩展方案,保证 SLA 的前提下提升系统整体吞吐,实现可靠有效触达,应对频高量大的业务场景。


对于用户而言,多样化的管理手段、多维度的运行指标查询,全方位的链路监控则是用户追求的,只有让用户从复杂混乱的定时任务场景中抽离出来,才能更加专注在业务研发。


2020-05-21 10:093562

评论 6 条评论

发布
用户头像
是一篇非常优秀的分布式任务调度系统启蒙文章
2022-06-29 10:02
回复
用户头像
推荐一个强大的分布式任务调度与计算框架PowerJob,支持CRON、API、固定频率、固定延迟等多种调度策略,支持MapReduce分布式计算,支持工作流任务编排(DAG),功能强大,文档齐全,接入简单!
项目地址:https://github.com/KFCFans/PowerJob
2020-11-08 12:01
回复
用户头像
感觉还是比较传统的一个架构。
2020-10-28 15:03
回复
用户头像
有点意思,跟我们的设计部分理念,但是我们的设计更优
2020-05-25 10:09
回复
可否分享一下
2020-06-24 16:10
回复
暂时公司内部不开源,稍微提几个关键词吧:作业状态流转 master egde 控制信道 数据信道
2020-07-01 09:58
回复
没有更多了
发现更多内容

Go流程控制——条件语句

爱好编程进阶

Java 程序员 后端开发

4月份,我月更了 25 篇文章,撸了 4w 多字

杨成功

程序员 数据结构 前端

GroupingComparator分组

爱好编程进阶

Java 程序员 后端开发

Stack 顿悟三部曲(3):溯源 goroutine 堆栈

蓬蒿

golang 堆栈 协程 stack goroutine

【INFOCOM 2022】支持任意网络拓扑的同步流水线并行训练算法,有效减少大规模神经网络的训练时间

阿里云大数据AI技术

神经网络 机器学习 算法 并行训练算法

2022金蝶云苍穹峰会抢先看

金蝶云·苍穹

苍穹峰会 苍穹5.0 人力云

OneFlow如何做静态图的算子对齐任务

OneFlow

人工智能 graph 自动测试 算子对齐

上市商业银行手机银行场景建设专题分析

易观分析

商业银行 手机银行

造孽啊!阿里内部的神级项目和JDK源码阅读指南竟惨遭GitHub开源

Java架构追梦

Java 程序员 后端开发

惨遭面试官吊打高并发系统设计,回来学习2400小时后成功复仇

Java架构追梦

Java 后端开发 程序员面试

Q1手机银行运营报告:交易规模超150万亿,月活跃用户4.9亿

易观分析

手机银行

LAXCUS分布式操作系统:云盘的使用

LAXCUS分布式操作系统

云盘 分布式存储 分布式软件系统

Java 生成随机数的 5 种方式,你知道几种?

爱好编程进阶

Java 程序员 后端开发

Java面试前的敲门砖:多线程+微服务spring源码+Redis+docker+Git

Java架构追梦

Java 后端开发 程序员面试

Java 类型信息详解和反射机制

爱好编程进阶

Java 程序员 后端开发

Day200

爱好编程进阶

Java 程序员 后端开发

2022年4月国产数据库大事记

墨天轮

数据库 opengauss TiDB 国产数据库 达梦

Stack 顿悟三部曲(2):穿越虚拟内存的迷雾

蓬蒿

线程 cpu 堆栈 进程

EL和JSTL基本使用

爱好编程进阶

Java 程序员 后端开发

刷了三个月leetcode算法,顺利拿下百度、阿里等大厂的offer

Java架构追梦

Java 后端开发 数据与算法

GNN在下拉推荐的应用

爱好编程进阶

Java 程序员 后端开发

IDEA的Docker插件实战(Dockerfile篇)

爱好编程进阶

Java 程序员 后端开发

java poi 读取Excel中的手机号或电话号码,手机号变成1

爱好编程进阶

程序员 后端开发

Java StringBuffer 动态字符串

爱好编程进阶

程序员 后端开发

java 通过 SmbFile 类操作共享文件夹

爱好编程进阶

程序员 后端开发

AliIAC 智能音频编解码器:在有限带宽条件下带来更高质量的音频通话体验

阿里云视频云

语音 音频 视频云 音频编码器

中小型企业团队的CRM系统最佳实践

低代码小观

低代码 CRM 客户关系管理 CRM系统 客户关系管理系统

FastDFS 和nginx整合

爱好编程进阶

Java 程序员 后端开发

ETL自动化运维调度管理工具 TASKCTL 流程文件系统

敏捷调度TASKCTL

程序员 DevOps 运维 ETL 大数据运维

真可笑!拿着这份JVM学习笔记学了2个月,就想着出去跳槽涨10k

Java架构追梦

Java 程序员 后端开发

Alibaba最新出版的JDK源码剖析手册(究极奥义版)开源

Java架构追梦

jdk java面试 后端开发

探寻繁杂定时任务的解决方案:分布式任务调度系统_架构_李登科_InfoQ精选文章