Senior / Staff Infra SWE · VO System Design

LinkedIn Job Scheduler:未来 N 小时查询、重试和并行执行

任务执行队列与未来任务 Dashboard 读模型分开,说明时间索引、租约、失败重试和高并发语义。

题目重点:任务执行队列与未来任务 Dashboard 读模型分开,说明时间索引、租约、失败重试和高并发语义。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 任务至少有 id、tenant、next_run_at、状态与执行参数;训练场景允许至少一次执行,业务副作用须由任务 id/执行代数做幂等。
  • Dashboard 显示未来窗口中的计划任务,需说清是否包含暂停、重试、周期任务的展开实例和时区;题目未固定这些规则。

解题路线

  1. 提交事务将任务定义、下一次计划时间与版本写入持久库,按 (tenant, next_run_at, id) 建范围索引。Dashboard 查询 [now, now+N) 走索引分页,返回水位/版本;高读量可维护按时间分桶的只读投影,但要向用户标明延迟。
  2. 调度扫描器按时间窗口取到期任务,使用条件更新抢占 lease 并投递执行消息;worker heartbeat 延期,完成时检查 lease generation 再提交结果。超时可重新投递,旧 worker 完成不得覆盖新代状态。
  3. 失败按可配置退避重新设 next_run_at,永久失败进入 dead-letter;并行任务按 tenant 配额与优先级调度。周期任务把规则与下一实例分开保存,避免一次性展开无限未来。
  4. Dashboard 不直接扫 worker 队列,运行状态与计划时间来自可查询 read model。大窗口分页时用稳定 (next_run_at,id) 游标并固定快照时间,避免刷新造成漏/重。
  5. 对未来 N 小时的统计可按分钟/小时分桶增量维护,详细列表仍以范围索引为准;任务改期/取消同时更新计数,异步投影要能回放对账。

手动走一遍

任务 A 10:05 执行、B 11:00 执行,10:00 查询未来 1 小时只返回 A;扫描器在 10:05 抢 A 的 generation=4 lease。worker 超时后 generation=5 重试,迟到的第 4 代完成回报被拒绝;外部付款以稳定业务幂等键避免重复扣款。

规模与取舍

有 T 个任务、窗口命中 K 条时,范围索引查询约 O(log T+K) 并加分页 IO;扫描器取到期任务也按索引顺序 O(log T+B) 每批 B 条。持久存储 O(T),分桶投影随保留窗口和租户数增长。题目无 QPS,容量数值须当轮询问。

易错点与追问

容易失分的边界

  • 只建 worker queue,没有可查未来任务的索引。
  • 声称 exactly-once 执行,却不处理 worker 超时与副作用重试。
  • 周期任务一次展开到无限未来。
  • 直接 offset 分页,任务改期时漏/重。
  • Dashboard 的状态和队列真相不一致却没有水位与对账。

继续深挖

  • 改期和取消已入队任务如何生效?
  • 未来 N 小时跨时区/夏令时时如何定义?
  • 几百万个相同时刻任务如何削峰?
  • 多地域故障后怎样接管 lease?
  • 若任务是 CI/CD 步骤,如何在已确定 DAG 依赖与环境隔离规则后复用 lease、重试和状态模型?
✓已复制微信号!