主要方式为预解析、智能缓存与懒加载。
预解析是在 App 应用初始化阶段的启动期进行预热,即针对业务的热点域名在后台发起异步的 DoH 解析请求。这部分预解析结果在后续的业务请求中可以直接使用,进而消除首次业务请求的 DNS 解析开销,提升 App 加载速度。
通过预解析获取域名的 IP 地址,同时也会有 TTL 缓存有效时间,这个 IP 地址需要合理缓存。通常操作系统本身的 DNS 缓存粒度比较粗,只是域名与地址的关系,但在客户端可以实现更细粒度的缓存管理来提升解析与使用效率。
比如在不同的网络运营商环境下,对域名的解析结果可能会发生变化,当我们使用电信 Wi-Fi 时,解析会返回就近的电信节点的 IP 地址,当我们使用联通 3G 时,解析会返回就近的联通节点的 IP 地址。我们可以针对不同运营商的解析结果进行缓存或者根据不同 Wi-Fi 的 SSID 进行缓存,确保我们在网络切换时能快速准确地获取到对应网络下的解析地址。甚至, 我们可以做本地的持久化缓存,当下一次 App 启动时直接读取缓存用于网络访问,提升用户体验。当然,这种持久化缓存一定要同时设计好缓存失效机制。
还有一种优化策略是懒加载。
懒加载与预解析的配合使用可以真正实现 DNS 的零延迟解析,核心实现思路主要是两点:
① 业务层的域名解析请求只和本地缓存交互,不发生实际的网络解析请求,如果缓存存在,不管是否过期都直接返回缓存的记录。
② 若缓存过期,在返回结果的同时,发起一个异步后台网络请求与 DoH 服务器获取新的地址。
返回一个过期的 IP 地址,好像又变成了像 LocalDNS 一样更新不及时。但实际上不一样,因为 LocalDNS 的不及时是不可控的,而我们虽然返回了一个过期的 IP 地址,但同时也会异步地去更新缓存的内容,如果这个过期的 IP 地址在业务上无法正常使用,可以重新通过缓存获取到更新后的 IP 地址。
另外异步 HTTP 请求还可以将多个过期或即将过期的域名,通过一条请求发送给 DoH 服务端,从而减少网络的消耗以及服务器的压力。
当然,实际业务中,优化手段的选择需要根据业务情况进行适配选择,以更好地应对业务挑战及实现安全、可靠的网络访问。 |