系统设计练习 - Global Job Scheduling Platform

发布时间:2026/9/11 11:36:14

系统设计练习 - Global Job Scheduling Platform 背景设计一个分布式任务调度系统类似于AWS EventBridge SchedulerKubernetes CronJobGoogle Cloud SchedulerMetas internal distributed scheduler系统需要支持数亿100M定时任务系统需求功能需求1. 创建jobCreateJob( jobId, cron expression, callbackURL, payload )2. 修改job3. 删除Job4. Trigger Job5. 至少一次执行 At-least-once6. 支持Retry7. 用户可以查历史非功能需求1. Scale100 million jobs, peak is 2 million/minute2. availability: 99.99%3. durability: 即使整个machine挂掉job不能丢4. latency scheduled time /- 1 secondAPI设计1. Create JobPOST /job BODY: { cron: ****, url: /job/1234, payload: hello, world }2. Update JobPUT /job/{jobId} BODY: { cron: ****, url: /job/1234, payload: hello, world }3. Get JobGET /job/{jobId}4. Delete JobDELETE /job/{jobId}5. Trigger JobPOST /job/{jobId}/runs架构设计本系统的架构设计如下1. client通过API GW向后端发送job的CRUD请求。我们在后端设置scheduler service处理这种请求更新job的meda data DB。2. 在scheduler service初次创建一个job的时候将job的首个scheduling信息写到scheduling index DB里。Scheduling index DB使用AWS Dynamo DB。使用minute做parition key使用second做sort key。对于每个primary key维护一个job list。3. 启动scheduling workers通过shard lease获取对某些shard的记录的访问权限。scheduling workers会读取自己负责的shard的job ID将该job dispatch到queue中。在dispatch完成后scheduling workers重新计算该job的下一次fire time更更新scheduling index DB。4. Execution workers会从dispatch queue读出dispatched job然后执行。并且将执行的结果写入到execution history DB里。5. 如果是trigger job我们只需要将该job ID存入到当前即将执行的scheduling index DB的primary key中即可。讨论本系统设计的核心在于对于非常多需要调度的任务怎样快速查找到当前需要调度的任务。这里的思路是通过DDB的schema设计由minutepartition key和secondsort key保存每秒需要调度的任务ID。下面我们讨论以下问题1. 如果某个时刻比如零点需要调度的任务非常多应该如何处理?分为两种情况。第一种job的execution时间不是非常严格。这种情况下我们可以考虑给每秒的可以execute的job设置一个上限。超过上限则放到下一个bucket里。这样可以平滑job运行的峰值。第二种job的execution时间是严格的。我们可以认为scheduling workers是可以一直scale out的我们唯一需要处理的问题是DDB的hot partition的问题。我们可以考虑将大的bucket的primary key加上suffix进一步划分为多个bucket。比如分钟_1, 分钟_2, ...。
延伸阅读

更多相关文章

2026/9/10 2:10:46

C++ XML解析利器CMarkup:轻量级单文件库的流式导航实战

1. 项目概述:为什么是CMarkup?在C项目里处理XML,你是不是也经历过那种“杀鸡用牛刀”的尴尬?比如,你只是想读个配置文件,解析一下从网络接口返回的简单数据包,或者保存一点游戏存档。这时候&…

2026/9/11 12:12:21

windows网络适配器驱动开发-NetAdapterCx 接收端缩放(下)

第三部分:NetAdapterCx 接收端缩放(RSS)—— 同步机制、异构 CPU 支持与调试八、SynchronizeSetIndirectionEntries 与同步机制NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES 结构中的 SynchronizeSetIndirectionEntries 成员允许客户端驱动程序…

2026/9/9 15:17:25

Python爬虫实战:AES解密金融数据接口全流程解析

1. 项目概述与核心价值最近在分析一些金融数据源时,遇到了一个典型的场景:某证券信息接口的数据返回并非明文,而是经过了AES加密。对于需要批量、自动化获取这类数据的开发者或数据分析师来说,手动复制粘贴显然不现实,…

2026/9/12 5:09:51

QML ListView实现可拖拽TabBar的完整方案

简介:本资源是一份面向Qt/QML开发者的技术实践Demo,聚焦于解决QML中TabBar标签无法原生拖拽交换位置的痛点问题。不同于QWidget体系下的QTabBar,QML TabBar需借助ListView自定义实现拖拽移动、动态增删页及内容同步切换功能,适用于…

2026/9/12 5:09:51

激光熔覆熔池流动的Comsol多物理场模拟:从方程到实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 5:09:51

SpringBoot+Vue全栈二手书商城开发实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 5:09:51

深入解析计算机内存管理机制与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 5:04:51

工业级安全锥检测系统:YOLOv8基线与模型沙盒工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 2:05:33

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/12 3:55:12

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介:本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包,聚焦于长鼻浣熊优化算法(COA)的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题,作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/10 12:32:02

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/10 15:49:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码