百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

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

ccwgpt 2024-10-12 02:51 28 浏览 0 评论

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

01

背景介绍

缘起缘灭,自有因果

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

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

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

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

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

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

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

02

现有的开源方案

它山之石可以攻玉 ...

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

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

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

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

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

开源方案的逻辑架构图

开源方案的技术实现图

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

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

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

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


03

TCT简介

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

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

04

技术架构

技术架构图

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

05

功能架构

功能架构图

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

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

触发器

  • 只需根据任务执行规则,计算解析出不同时点的任务触发事件。通过MQ的实现可靠性投递(后续文章会逐步讲解如何实现可靠性投递),起到削峰填谷,避免高峰IO等问题, 提高吞吐量。

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

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

  • 根据高频的任务执行策略,采取预加载策略和动态调整预加载算法,解决高频触发导致系统负载高的问题。

调度器

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

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

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

接入网关

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

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

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

  • 数据透传及路由,实现组件内闭环。

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

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

触发器

  • 通过有效的分片策略,在实现避免触发压力集中化的情况下,可快捷的完成服务的弹性扩缩容,实现近似无状态的水平扩展。

调度器

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

接入网关

  • 完全无状态的设计方案,可实现无状态的水平扩容,实现理论上TCP连接数无上限。

优点三:功能完备

灵活的触发规则

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

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

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

任务管理

支持三种执行方式

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

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

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

任务调度执行方式

支持三种触发方式

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

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

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

任务触发方式

日志溯源能力

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

日志查询

支持复杂的任务编排能力

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

任务编排

06

总结

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

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

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

  • 如何写出简洁的 CQRS 代码?

  • 程序中的“零成本抽象”如何实现?

  • 同程艺龙云原生 K8s 落地实践

  • 比特币减半6行代码解读

  • 深入解读HTTP3的原理及应用

本文由腾讯云中间件供稿,技术原创及架构实践文章,欢迎通过公众号菜单「联系我们」进行投稿。

高可用架构改变互联网的构建方式

相关推荐

用Steam启动Epic游戏会更快吗?(epic怎么用steam启动)

Epic商店很香,但也有不少抱怨,其中一条是启动游戏太慢。那么,如果让Steam启动Epic游戏,会不会速度更快?众所周知,Steam可以启动非Steam游戏,方法是在客户端左下方点击“添加游戏”,然...

Docker看这一篇入门就够了(dockerl)

安装DockerLinux:$curl-fsSLhttps://get.docker.com-oget-docker.sh$sudoshget-docker.sh注意:如果安装了旧版...

AYUI 炫丽PC开发UI框架2016年6月15日对外免费开发使用 [1]

2016年6月15日,我AY对外发布AYUI(WPF4.0开发)的UI框架,开发时候,你可以无任何影响的去开发PC电脑上的软件exe程序。AYUI兼容XP操作系统,在Win7/8/8.1/10上都顺利...

别再说C#/C++套壳方案多了!Tauri这“借壳生蛋”你可能没看懂!

浏览器套壳方案,C#和C++有更多,你说的没错,从数量和历史积淀来看,C#和C++确实有不少方式来套壳浏览器,让Web内容在桌面应用里跑起来。但咱们得把这套壳二字掰扯清楚,因为这里面学问可大了!不同的...

OneCode 核心概念解析——Page(页面)

在接触到OneCode最先接触到的就是,Page页面,在低代码引擎中,页面(Page)设计的灵活性是平衡“快速开发”与“复杂需求适配”的关键。以下从架构设计、组件系统、配置能力等维度,解析确...

React是最后的前端框架吗,为什么这么说的?

油管上有一位叫Theo的博主说,React是终极前端框架,为什么这么说呢?让我们来看看其逻辑:这个标题看起来像假的,对吧?React之后明明有无数新框架诞生,凭什么说它是最后一个?我说的“最后一个”不...

面试辅导(二):2025前端面试密码:用3个底层逻辑征服技术官

面试官放下简历,手指在桌上敲了三下:"你上次解决的技术难题,现在回头看有什么不足?"眼前的候选人瞬间僵住——这是上周真实发生在蚂蚁金服终面的场景。2025年的前端战场早已不是框架熟练...

前端新星崛起!Astro框架能否终结React的霸主地位?

引言:当"背着背包的全能选手"遇上"轻装上阵的短跑冠军"如果你是一名前端开发者,2024年的框架之争绝对让你眼花缭乱——一边是React这位"背着全家桶的全能选...

基于函数计算的 BFF 架构(基于函数计算的 bff 架构是什么)

什么是BFFBFF全称是BackendsForFrontends(服务于前端的后端),起源于2015年SamNewman一篇博客文章《Pattern:BackendsFor...

谷歌 Prompt Engineering 白皮书:2025年 AI 提示词工程的 10 个技巧

在AI技术飞速发展的当下,如何更高效地与大语言模型(LLM)沟通,以获取更准确、更有价值的输出,成为了一个备受关注的问题。谷歌最新发布的《PromptEngineering》白皮书,为这一问题提供了...

光的艺术:灯具创意设计(灯光艺术作品展示)

本文转自|艺术与设计微信号|artdesign_org_cn“光”是文明的起源,是思维的开端,同样也是人类睁眼的开始。每个人在出生一刻,便接受了光的照耀和洗礼。远古时候,人们将光奉为神明,用火来...

MoE模型已成新风口,AI基础设施竞速升级

机器之心报道编辑:Panda因为基准测试成绩与实际表现相差较大,近期开源的Llama4系列模型正陷入争议的漩涡之中,但有一点却毫无疑问:MoE(混合专家)定然是未来AI大模型的主流范式之一。...

Meta Spatial SDK重大改进:重塑Horizon OS应用开发格局

由文心大模型生成的文章摘要Meta持续深耕SpatialSDK技术生态,提供开自去年9月正式推出以来,Meta持续深耕其SpatialSDK技术生态,通过一系列重大迭代与功能增强,不断革新H...

"上云"到底是个啥?用"租房"给你讲明白IaaS/PaaS/SaaS的区别

半夜三点被机房报警电话惊醒,顶着黑眼圈排查服务器故障——这是十年前互联网公司运维的日常。而现在,程序员小王正敷着面膜刷剧,因为公司的系统全"搬"到了云上。"部署到云上"...

php宝塔搭建部署thinkphp机械设备响应式企业网站php源码

大家好啊,欢迎来到web测评。本期给大家带来一套php开发的机械设备响应式企业网站php源码,上次是谁要的系统项目啊,帮你找到了,还说不会搭建,让我帮忙录制一期教程,趁着今天有空,简单的录制测试了一下...

取消回复欢迎 发表评论: