OCI IC4 · VO System Design

Oracle Bitly 短链接设计:短码、重定向与点击统计

把 Oracle IC4 题目的 Bitly 设计题展开为可讨论的读写路径、短码分配、缓存和异步统计方案。

题目重点:把 Oracle IC4 题目的 Bitly 设计题展开为可讨论的读写路径、短码分配、缓存和异步统计方案。

题意与假设

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

  • 训练版提供 create(longUrl, owner, optionalAlias) 与 redirect(code),支持失效时间;实际需求应先向面试官确认。
  • 设每秒 100 次创建、1 万次跳转、保存 5 年;据此估算约 158 亿次创建上界和读写比,而不是把这个数字归于题目。

解题路线

  1. 先定短码命名空间:随机 8 字符 Base62 有约 2.18×10¹⁴ 个候选,创建时以唯一索引处理碰撞;若用分布式序列号转 Base62,须防枚举和推断创建量。
  2. 创建路径做 URL 验证、用户限额与恶意域名检查,在主存储以 code 唯一键原子插入 longUrl、owner、expiry、status;幂等键避免重试生成多个码。
  3. 跳转路径先查缓存,再读主存储并检查失效与禁用状态,返回 302/307;需要让目标变化立即生效时避免长期 301 和不可控浏览器缓存。
  4. 点击事件异步写入日志/队列,按 code 和时间窗聚合;明确统计是近实时估计还是可审计精确数,排除机器人、重复投递并保留原始事件以便回算。
  5. 以热门短码、高速枚举、恶意链接、缓存失效、数据库分片迁移和异地故障做容量与安全追问。

手动走一遍

用户创建 https://example.org/article 得到 ab7K2xQp;首次 GET /ab7K2xQp 查存储并写缓存、发 302;下一次命中缓存;两次点击各产生事件,聚合器的统计允许短暂滞后。若链接已撤销,即使缓存仍有值也必须通过短 TTL 或主动失效阻止跳转。

规模与取舍

单次创建/跳转的逻辑查找期望 O(1),实际由索引、缓存与网络延迟决定;存储 O(U+E),U 为短链数、E 为保留的点击事件数。100 次/秒持续 5 年约 158 亿条短链,需按真实保留期和平均 URL 长度再估算字节。

易错点与追问

容易失分的边界

  • 只说 Base62 而不解释唯一性、碰撞重试和定制 alias 冲突。
  • 把点击计数同步写到短链行,热门链接造成写热点。
  • 使用永久重定向后仍承诺可立即撤销或更新目标。
  • 忽略钓鱼、垃圾链接和批量枚举。

继续深挖

  • 如何在保持全局唯一的前提下跨地域分配短码?
  • 若产品要求精确、按用户去重的点击数,事件和隐私口径如何改变?
  • 链接撤销后如何处理 CDN、应用和浏览器三层缓存?
✓已复制微信号!