传统 DNS 存在哪些问题?
解析慢,更新不及时。缓存、域名转发、NAT 问题导致客户端误会自己所在的位置和运营商,从而影响流量的调度。
HTTPDNS 的工作模式
HTTPDNS 是自己搭建基于 HTTP 协议的 DNS 服务器集群,分布在多个地点和多个运营商。当客户端需要 DNS 解析时,直接通过 HTTP 协议请求这个服务器集群,得到就近的地址。
使用 HTTPDNS 的,往往是手机应用,需在手机端嵌入支持 HTTPDNS 的客户端 SDK。
在客户端的 SDK 里动态请求服务端,获取 HTTPDNS 服务器的 IP列表,缓存到本地。SDK 也会将 DNS 域名解析结果缓存在本地。
手机要访问一个地址时,如果本地缓存中有,则返回。该缓存是手机应用自己做的,而非运营商统一做的。如何更新、何时更新,手机应用的客户端可以和服务器协调。
如果本地没有,则请求 HTTPDNS 的服务器,在本地 HTTPDNS 服务器的 IP 列表中,选择一个发出 HTTP 的请求,会返回一个要访问的网站的 IP 列表。
手机客户端知道手机在哪个运营商、哪个地址,使用 HTTP 通信时,HTTPDNS 服务器能准确知道这些信息,因而可以精准的全局负载均衡。
如果 HTTPDNS 不工作时,可切回传统的 DNS。
HTTPDNS 如何解决传统 DNS 的问题?
1、解析速度和更新速度的平衡问题—HTTPDNS 的缓存设计
将解析速度和更新速度掌握在自己手中。一方面,一个 HTTP 的请求直接搞定域名解析,不需要 DNS 服务器递归一圈;另一方面,缓存由客户端 SDK 维护,过期时间、更新时间都由自己控制。
DNS 缓存在内存中,也可以持久化到存储上。
SDK 中的缓存对缓存过期时间较为严格,当缓存没有命中,或已过期且客户端不允许使用过期的记录,则会发起一次解析,更新记录。
解析可以同步,即直接调用 HTTPDNS 的接口,返回最新的记录,更新缓存;也可以异步进行,添加一个解析任务到后台,由后台任务调用 HTTTPDNS 的接口。
2、智能调度问题—调度设计
- 客户端嵌入了 SDK,可知道手机的地理位置、运营商。
- 客户端的 SDK 会收集手机网络请求数据,如错误率、请求时间等,发送到统计后台,查看不同 IP 的服务质量。
- 在服务端,应用可通过调用 HTTPDNS 的管理接口,配置不同服务质量的优先级、权重。
根据以上信息,HTTPDNS 服务端便可选择最佳的服务节点。