知识卡片

缓存维度要匹配最优值实际随之变化的那个环境维度

普通读书笔记卡

内容

HttpDNS客户端库缓存的服务器IP优先级、成功/失败次数等数据,并不是按域名全局统一存一份,而是分别按当前所处的SP(移动/联通/电信等运营商标识)或者WiFi的SSID名字来分别缓存——因为不同运营商网络、不同WiFi环境下,同一个域名解析出的最优(延迟最低、最稳定)服务器IP往往是不一样的,用同一份全局缓存会导致在网络环境切换后仍然返回并不适合当前网络的旧记录。在WiFi环境下由于设备本身无法直接判断出当前用的是哪个运营商,改用SSID作为缓存维度做近似替代(因为同一个WiFi的SSID背后对应的运营商链路一般不会频繁变化),当网络环境(SP或SSID)发生变化时,系统会重新检查缓存中是否有针对当前链路的最优记录,没有则重新查询更新。这个案例给出一条通用的缓存设计原则:缓存的分片/隔离维度,应该和真正会导致”同一个key对应的最优值发生变化”的那个维度保持一致,如果被缓存的最优结果实际上会随某个环境因素(这里是网络链路)变化,缓存粒度就不能停留在更粗的维度(这里是仅按域名),否则缓存返回的结果会失真。

参考来源

- 位置:《高可用架构(第1卷)》第7章《安全与网络》"7.2 App域名劫持之DNS高可用——开源版HttpDNS方案详解"节,"7.2.4 开发过程中的一些问题及应对","2.网络发生变化后,返回的A记录还一样吗?"(源文件:_epub-src/OEBPS/Text/Chapter7_2_5.xhtml) - 结论依据:原文说明"数据库中缓存的数据,是根据当前SP来缓存的,也就是说当自身网络环境变化后,返回的A记录是不一样的……如果在WiFi网络环境下,则根据当前SSID来缓存A记录,因为在WiFi环境下库自己没有办法明确判断出自己的运营商,但相同的SSID不会发生频繁的网络运营商变化",直接支撑本卡片结论。 - 原始内容:数据库中缓存的数据,是根据当前SP来缓存的,也就是说当自身网络环境变化后,返回的A记录是不一样的。手机网络下会根据当前SP来缓存A记录服务器IP,如果在WiFi网络环境下,则根据当前SSID来缓存A记录。