网络协议之传统DNS存在的问题以及httpdns
写在前面
传统的DNS虽然使用的非常广泛,但是也是存在一些问题的,本文就来一起来看下,以及其解决方案http dns。
1:传统DNS存在的问题
1.1:域名缓存问题
用户某次访问时,可能已经有了距离用户更近的服务IP,但是因为还是使用缓存的那个服务IP(注意并不是不能用了),所以就无法拿到最优的那个IP了。
1.2:域名转发问题
存在这个问题的原因是,有些运营商,自己并不会取获取DNS信息,而是将这个工作转发到其他的运营商来做,而DNS服务器来返回IP地址时会根据当前请求者所在的运营商,优先返回同一个运营商的IP地址,这样访问的速度会更快,而因为中间转发了一次,所以,最终返回的IP地址就不一定和用户是同一个运营商了。如下:

1.3:NAT
同域名转发,可能会造成返回非同一个运营商下IP的问题。
1.4:域名更新问题
传统的DNS服务器解析流程如下:

这里的域名更新问题,就出在本地DNS服务器上,这个本地DNS服务器,是网络所属的运营商提供的,是不受我们自己控制的,而不同的运营商提供的本地DNS服务器的质量也是参差不齐,所以,就会存在对缓存处理上的不足,比如明明已经过期了却还不重新请求(忽略TTL,一种不负责的做法),而因为这不是我们自己的服务,所以对此也无能为力。
1.5:解析延迟
传统的DNS服务器解析流程如下:

一层套一层,需要多个请求,对于延时比较敏感的应用不是很友好,甚至可能造成解析超时。
2:httpDNS
httpDNS就是搭建一个基于http协议的服务或者是服务集群,然后通过访问这些http服务来获取IP地址,而因为是自己的服务,所以对于过期时间,更新啥的都好说,而不用受制于运营商的本地DNS缓存。因为需要绕过默认的DNS解析流程,所以需要额外的SDK的支持。但这种方式目前主要还是使用在手机移动客户端,架构如下:

主要是缓存设计,和智能调度两部分。分别看下。
2.1:缓存
为了方便理解httpDNS缓存,来和应用架构的缓存做个对比:

- 同步更新
同步更新就是,如果是本地缓存过期,则直接请求httpDNS服务器,对应到应用架构就是Cache-aside 机制,即先读缓存,缓存读不到再请求HTTP DNS服务,如下图:

这种方式好处是保证数据最新,坏处是对httpDNS服务器在过期那一刻,可能会存在并发访问,增加httpDNS服务器的压力,当然也是一种浪费。 - 异步更新
对应到应用架构缓存就是refresh-aside 机制,即通过异步的方式来更新缓存,好处是保证只有一个请求更新缓存,坏处是如果是更新不及时可能会读到过期的数据。如下图:

2.2:智能调度
为了能够保证返回最优的一个IP地址给客户端,需要综合考虑各方面的因素,除了距离之外,还要考虑,服务器响应速度(sdk上报),错误率(sdk上报),服务是是否存活(健康检测),为了能够综合处理这些信息,就需要智能调度这样的一个组件。当然HTTP DNS也需要开放接口来让用户对调度策略进行查看和管理,所以最终架构如下:

写在后面
参考文章列表
网络协议之DNS 。
