知识卡片
缓存逻辑指针而非提前解析的物理值,以适应环境切换
内容
当HttpDNS查询到的结果是一个CNAME(域名别名,比如CDN返回的CNAME记录)时,客户端数据库缓存的是这个CNAME字符串本身,而不是把CNAME进一步解析成具体IP地址之后再缓存那个IP。这个决定背后的原因是团队实测发现,从物理位置上”走出一栋大楼、进入另一栋大楼”这样的网络环境切换,同一个CNAME最终解析出来的实际IP就可能不一样——如果提前把CNAME解析成某个具体IP缓存下来,网络环境一变,缓存里的这个IP就可能已经失效或不再是最优选择,还得重新判断这份缓存是否该失效;而如果缓存的是CNAME这个”逻辑指针”本身,每次网络环境变化后,通过这个不变的CNAME重新解析出当前环境下正确的IP即可,不需要额外的失效判断逻辑。这个案例给出一条通用的缓存设计原则:当一个逻辑标识对应的物理值本身会随外部环境(这里是网络链路)变化时,缓存这个不随环境变化的逻辑标识本身,比提前把它解析成某个时间点上正确、但环境一变就可能不再正确的物理值更稳妥,把”解析成具体值”这一步推迟到真正需要用的那一刻按当前环境执行。
参考来源
- 位置:《高可用架构(第1卷)》第7章《安全与网络》"7.2 App域名劫持之DNS高可用——开源版HttpDNS方案详解"节,"7.2.5 疑问与解惑"(源文件:_epub-src/OEBPS/Text/Chapter7_2_6.xhtml)
- 结论依据:原文说明"数据库中记录的是CNAME,并不是IP。因为我们测试过,从一栋大楼走到另外一个大楼里面,访问的最终IP可能都不相同。所以如果返回的是CNAME,则直接存储CNAME。网络环境发生变化,会重新拉取,不会使用缓存的CNAME",直接支撑本卡片结论。
- 原始内容:数据库中记录的是CNAME,并不是IP。因为我们测试过,从一栋大楼走到另外一个大楼里面,访问的最终IP可能都不相同。所以如果返回的是CNAME,则直接存储CNAME。