Full-stack / Azure Network Stack · Second Round LLD

Microsoft Full-stack DNS 设计:查询链路、负载均衡与缓存边界

以题目 DNS LLD、顶级域负载均衡和 LRU 缓存为锚点,区分解析缓存 TTL、故障与 DNS 权威数据。

题目重点:以题目 DNS LLD、顶级域负载均衡和 LRU 缓存为锚点,区分解析缓存 TTL、故障与 DNS 权威数据。

题意与假设

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

  • 训练版入口是 resolve(name,type)→answer 或明确错误;服务作为递归解析器/缓存层,不负责编辑权威 zone。
  • 缓存键包含规范化域名、查询类型和必要的租户/视图;缓存条目尊重 DNS 回答 TTL,容量满时用 LRU 逐出。
  • 上游池可按 root/TLD/authoritative 层选择健康节点;真实 DNS 有 referral、CNAME、DNSSEC 等复杂协议,本文只讨论面试级骨架。
  • 题目未明确规模,QPS、延迟和可用性目标都作为提问项,不写成微软生产系统指标。

解题路线

  1. 先问清设计角色:stub resolver、递归 resolver、权威服务器还是 DNS load balancer;不同角色的数据所有权截然不同。
  2. 解析请求先查带到期时刻的缓存,命中直接返回。未命中做合法性/环路检查,按根→TLD→权威委派链查询;可缓存 referral 与最终答复,但每层都用自己的 TTL。
  3. TLD 上游池的选择模块维持健康检查、超时、重试预算和熔断;一次上游超时换副本,不能无限重试放大流量。
  4. 缓存需要将 TTL 与 LRU 分开:TTL 是正确性上限,LRU 是容量策略。到期条目即使最近访问也无效;负缓存需独立 TTL,避免不存在域名被长期记死。
  5. CNAME 链设最大跳数和 visited,避免循环;监控缓存命中率、上游错误、TTL 过期、尾延迟和热域名负载。

手动走一遍

客户端查 app.example 的 A 记录:缓存 miss 后逐级拿 referral、再问权威取得地址及 TTL=60 秒;在有效期内重复查询命中缓存。60 秒到期后即便它刚被访问,也必须重新解析;若缓存容量满但条目仍有效,可因 LRU 被提前逐出,这只损失命中率不损害正确性。

规模与取舍

缓存命中预期 O(1) 查找和 LRU 调整;未命中网络成本由委派深度 h、上游超时/重试和 CNAME 跳数决定。缓存内存约 O(条目数×平均答复大小),容量、TTL 分布和热键流量须基于实际 QPS 估算。负载均衡健康表按上游节点数 U 占 O(U)。

易错点与追问

容易失分的边界

  • 未确定 DNS 服务角色就把权威 zone 写入与递归解析混成一个类。
  • 只用 LRU 不检查 DNS TTL,返回过期记录。
  • 把同域名不同查询类型或租户视图共用缓存键。
  • 无限 CNAME 跳转/上游重试造成环路或放大。
  • 把候选人写的 TLD load balancer 类推断为原题要求的完整生产 DNS 架构。

继续深挖

  • 如何避免同一热域名到期时上千请求同时穿透到上游?
  • DNSSEC 验证和错误缓存如何接入?
  • 多地区缓存怎样处理视图/地理位置差异?
  • 权威区更新后,现有 TTL 内的缓存新鲜度承诺是什么?
✓已复制微信号!