系统设计练习 - Global Job Scheduling Platform

发布时间:2026/11/3 21:51:12

系统设计练习 - 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/11/1 20:41:28

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

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

2026/10/25 12:09:34

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

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

2026/11/2 11:49:54

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

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

2026/11/3 21:48:03

WPS演示交互效果全解析:从考试到职场应用

1. 项目概述作为一名长期从事办公软件培训的讲师,我发现很多学员在准备计算机等级考试(二级WPS)时,对幻灯片交互效果设置这一考点存在普遍困惑。这不仅是考试重点,更是职场演示中的实用技能。今天我就来详细拆解这个知…

2026/11/3 21:48:03

17个成长任务纯接口自动化:从行为事件上报链到自动领奖

做任务系统的自动化测试做了几年,最常被问到的一类问题是:某个成长任务面板上那十几个任务,能不能不点界面,直接用接口一次性跑完。这个问题背后其实藏着一条完整的工程链路——行为事件上报链怎么还原、协议怎么固化、状态怎么推…

2026/11/3 21:48:03

ACPI设备电源状态转换中的三次存在性检查解析

1. ACPIDevicePowerProcessGenericPhase函数背景解析ACPI(Advanced Configuration and Power Interface)作为现代计算机系统中电源管理的核心规范,其设备电源状态转换过程涉及复杂的硬件-软件协同机制。ACPIDevicePowerProcessGenericPhase函…

2026/11/3 21:48:03

动态规划算法详解:从基础概念到经典问题解析

1. 动态规划基础概念解析动态规划(Dynamic Programming)是一种解决复杂问题的算法思想,它通过将原问题分解为相对简单的子问题来求解。这种方法特别适用于具有重叠子问题和最优子结构性质的问题。动态规划的核心思想可以概括为三个关键步骤:定义状态&…

2026/11/3 21:48:03

ESP32-C3 DNS过滤实战:封禁设备、暂停拦截与自定义域名

家里网络里挂一台 ESP32-C3 做 DNS 层面的去广告,这个方案我前后用了小半年,最大感受是:真正决定这套东西好不好用的,不是拦截列表有多大,而是封禁设备、暂停拦截、自定义域名这三件日常操作顺不顺手。装好第一天你会觉…

2026/11/3 21:43:02

MCP协议逆向工程实战:从抓包到Wireshark解析

1. 项目概述:当“逆向工程”撞上“MCP”,热榜登顶背后的真实图景“GitHub今日热榜 | 2026-10-08:逆向工程 MCP 登顶”——这个标题乍看像一则技术快讯,但拆开来看,它其实是一把钥匙,能打开当前软件开发、安…

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

2026/11/3 1:04:48

STM32实战:基于MAX14431数字隔离器的SPI隔离通信方案

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

2026/11/3 1:04:48

工业SPI隔离通信设计:MAX14431BAEE+与STM32L4A6RG实战

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

2026/11/3 1:04:48

STM32+NRF24L01无线抢答器:硬件设计、通信协议与低功耗实现

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

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

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

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

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