阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

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

  • 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:092967

评论 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
回复
没有更多了
发现更多内容

Python 内置界面开发框架 Tkinter入门篇 甲

eng八戒

Python GUI tkinter

开源移动核心网Magma架构设计启示

俞凡

架构 网络 通信

从任务分配角度来看管理

石云升

极客时间 1月月更 技术领导力实战笔记

GLM国产大模型训练加速:性能最高提升3倍,显存节省1/3,低成本上手

OneFlow

人工智能 深度学习

Portraiture2024汉化版磨皮插件下载

茶色酒

Portraiture2023 Portraiture

技术管理者如何获得下属的认同?

石云升

极客时间 1月月更 技术领导力实战笔记

【PHP】英文博客专栏PHP快速入门个人笔记

懒时小窝

php

【Redis技术专区】「优化案例」谈谈使用Redis慢查询日志以及Redis慢查询分析指南

洛神灬殇

redis 性能调优 慢查询

极客时间运维进阶训练营第十二周作业

9527

我总结了写出高质量代码的12条建议

JAVA旭阳

Java

复习前端:JavaScript V8 引擎机制

devpoint

chrome JIT V8

我们需要怎样的低代码平台

agnostic

低代码

OneFlow v0.9.0正式发布

OneFlow

人工智能 深度学习

JSON.stringify() 的 5 使用场景

devpoint

JavaScript 前端开发 JSON格式化

CleanMyMac X2024汉化版安装包新增

茶色酒

CleanMyMac X CleanMyMac X2023

会声会影2023和谐版本补丁包下载

茶色酒

会声会影 会声会影2023

关于环境变量配置的思考总结

timerring

Go 环境变量

复习前端:前端应掌握的网络知识

devpoint

OSI七层协议 http2 HTTPS协议加密

【腾讯云AI】用1行Python代码识别增值税发票,YYDS

程序员晚枫

Python 人工智能 发票 OCR

【Linux技术专题系列】「必备基础知识」一起探索和实践sftp配置之密钥方式登录

洛神灬殇

Linux SSH SSH工具 sftp

技术如何分担产品之忧?

石云升

极客时间 1月月更 技术领导力实战笔记

架构误区系列12:一切皆依赖云平台

agnostic

云计算 部署架构

万字长文搞懂产品模式和项目模式

俞凡

团队管理

FPGA:硬件描述语言简介

timerring

FPGA

CleanMyMac X2024版本值不值得买?

茶色酒

CleanMyMac X CleanMyMac X2023

如何用Know Streaming来查询Kafka的消息

石臻臻的杂货铺

Kafk

你知道哈希算法,但你知道一致性哈希吗?

JAVA旭阳

Java 架构

如何快速优雅的用Know Streaming创建Topic

石臻臻的杂货铺

获取 topic等信息 后端、

工作这么多年,我总结的数据传输对象 (DTO) 的最佳实践

JAVA旭阳

Java 架构

精华推荐 | 【JVM深层系列】「GC底层调优系列」一文带你彻底加强夯实底层原理之GC垃圾回收技术的分析指南(GC原理透析)

洛神灬殇

Java JVM JVM原理 2023

CleanMyMacX4.12.2最新版本更新下载

茶色酒

CleanMyMacX

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