NG SWE · VO System Design

Databricks VM IPv4 分配:空闲地址预占与外部 Attach API

设计 IP 池与 VM 绑定的 API、表结构及请求工作流,处理并发抢占、外部 attach 失败与回收。

题目重点:设计 IP 池与 VM 绑定的 API、表结构及请求工作流,处理并发抢占、外部 attach 失败与回收。

题意与假设

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

  • 训练版一个 IPv4 同时最多绑定一个 VM,一个 VM 至多一个主 IPv4;是否支持多 IP、租户/VPC、静态保留、IPv6 和具体 attach 参数需要当轮问。
  • 外部 attach 可能成功、确定失败或超时未知;若支持幂等键/查询绑定状态可安全恢复,若不支持只能进入人工/补偿待核。

解题路线

  1. schema:ip_address(ip primary key, pool_id, state FREE/RESERVED/ATTACHED/RELEASING, vm_id nullable, reservation_id, version, updated_at)、vm_binding(vm_id unique, ip unique, state, request_id unique)。唯一约束与条件更新保证两个并发请求不会抢同一地址。
  2. POST /vms/{vm_id}/ip-allocations 带 idempotency key。事务内查 VM 现有绑定或按稳定顺序选一条 FREE IP,条件改 RESERVED 并写绑定请求;提交后才调用外部 attach,不能持数据库锁跨网络调用。
  3. attach 成功后用 reservation_id/version 条件更新 RESERVED→ATTACHED;确定失败将地址恢复 FREE 并标请求 FAILED。超时未知时不能立即放回 IP,否则外部可能已经 attach;先调用外部查询或用相同幂等键重试,并保持 RESERVED 与恢复任务。
  4. DELETE /vms/{vm_id}/ip-allocation 先标 RELEASING、调用 detach,确认外部已脱离后才将地址恢复 FREE。重复删除返回稳定结果;VM 消失/回调乱序用状态机和版本校验。
  5. 查询 GET 以数据库绑定状态为主,并可附 external sync 状态;定期对账 IP 表与实际 VM attach 状态,处理进程宕机在事务/调用/确认各间隙的悬空记录。

手动走一遍

池里只有 10.0.0.7 空闲,VM-A/VM-B 同时申请:两个事务只有一个能把该行由 FREE 改 RESERVED。VM-A 外部 attach 超时后,地址仍 RESERVED;若 API 查询发现已绑定 VM-A,则提交 ATTACHED,绝不能马上让 VM-B 重用。

规模与取舍

索引查找/更新单次约 O(log P) 加事务 IO,P 为池地址数;外部 API 延迟占主要尾延迟。保留/回收任务与未决请求数成比例;题目没有 QPS、池规模或多区域要求,不应给假定容量。

易错点与追问

容易失分的边界

  • SELECT FREE 后不做条件更新,两个 VM 分到同 IP。
  • 数据库事务跨外部 attach 保持行锁。
  • attach 超时就立即把 IP 还池。
  • detach 未确认就复用 IP。
  • 重试没有 idempotency key,重复绑定或重复扣费。
  • 从通用大规模设计引入原轮未要求的中间件细节淹没 API/schema。

继续深挖

  • Attach API 没幂等能力时如何处理未知超时?
  • VM 删除与 IP 分配并发怎么办?
  • 同一请求重试如何拿到原绑定?
  • 池耗尽/地址隔离或保留 IP 怎样建模?
  • 如何对账实际 VM 状态?
✓已复制微信号!