尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
系统设计练习 - 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, ...。
RELATED

相关推荐

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

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

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

📅 2026/8/20 20:42:56
windows网络适配器驱动开发-NetAdapterCx 接收端缩放(下)

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

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

📅 2026/8/20 20:42:56
基于CNN的手势识别技术原理与游戏交互实践

基于CNN的手势识别技术原理与游戏交互实践

1. 项目背景与核心价值手势识别作为人机交互的重要方式,正在智能设备、虚拟现实、医疗辅助等领域快速普及。传统基于SVM或模板匹配的方法在复杂场景下往往表现不佳,而深度学习的出现为这一领域带来了突破性进展。这个项目选择CNN(卷积神经网络…

📅 2026/8/20 20:42:57
MORE NEWS

更多资讯

📰

MATLAB三维曲线拟合:参数化与弧长等分实战

简介:在 MATLAB 数据可视化与数值分析中,处理离散点云或轨迹数据时常需要将三维空间点拟合成光滑连续曲线,并得到曲线上的 n 等分点;这份脚本正可解决这一需求。它接收 x、y、z 坐标列,借助三次样条插值生成多段样条曲…

📰

视觉大模型实战:多模态融合架构、高效训练与边缘部署全流程

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

📰

数字集成电路布图规划:芯片物理设计的第一道生死线

1. 这不是画图,是给芯片“搭房子”的第一道生死线你拿到一块数字集成电路的网表(netlist),里面密密麻麻全是逻辑门、寄存器、加法器、乘法器……但它们此刻只是抽象符号,没有尺寸、没有位置、没有金属层、没有供电路径…

📰

memU 存储架构解析:可插拔数据库抽象与后端感知的向量检索策略(ADR 0002)

memU 存储架构解析:可插拔数据库抽象与后端感知的向量检索策略(ADR 0002) 【免费下载链接】memU Personal memory across agents 项目地址: https://gitcode.com/GitHub_Trending/mem/memU 本文围绕 memU 的架构决策记录 ADR 0002 展开…

📰

基于SpringBoot与LSTM的智能餐饮需求预测系统

1. 项目背景与核心价值自助餐厅的菜品供应一直是个复杂的管理难题。传统人工经验判断的方式常导致食材浪费或供不应求,特别是在高校、企业食堂等大规模用餐场景中。我们团队开发的这套系统,通过整合SpringBoot后端框架与大数据分析技术,实现了…

📰

从公式到代码:手写DFT彻底搞懂FFT与频谱分析

1. 从公式到代码:DFT到底在算什么搞信号处理的人,十有八九都经历过这样一个阶段:教材翻到离散傅里叶变换那一章,公式看了无数遍,笔记抄了厚厚一摞,考试也能拿高分,但一问到"DFT的代码到底怎…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬