当前位置: 首页 > news >正文

HTTPDNS

HTTPDNS

  • HTTPDNS
    • 传统DNS存在的问题
    • HTTPDNS的工作模式
    • HTTPDNS的缓存设计
    • HTTPDNS的调度设计

HTTPDNS

传统DNS存在的问题

1.域名缓存问题

服务商为了节约流量计算的成本,会将一些经常访问的域名以及IP的映射在本地进行缓存。当有其它相同的请求时,会直接返回这个缓存数据。

另外,有的运营商会把一些静态页面,缓存在本运营商的服务器中,这样用户的请求就不用再通过其它运营商的服务器访问静态资源。在域名解析的时候,不会将用户导向真正的网站,而是指向这个缓存的服务器。

这些缓存都存在更新不及时问题,导致无法获取最新的数据,第一种情况还可能会导致全局负载均衡失败。

2.域名转发问题

假如你是运营商A的客户,当你发送请求到运营商A,A却将请求转发给运营商B,然后B去解析,然后返回一个在B运营商的网站地址。这样就会导致你每次访问都要跨运营商,速度就会很慢。

运营商转发用户请求可能会导致每次客户访问的时候都要跨运营商,速度就会很慢。

3.出口NAT问题

在局域网中的机器使用NAT地址转换访问外部网络时,权威的DNS服务器无法通过转换地址来判断客户端到底是来自哪个运营商,并且可能会导致误判运营商,导致跨运营商的访问。

4.域名更新问题

有的本地DNS服务器会忽略域名解析结果的TTL时间限制,在权威DNS服务器解析变更的时候,可能会导致解析结果在全网生效的周期非常漫长。

例如,双机房部署的时候,跨机房的负载均衡和容灾多使用DNS来做。当一个机房出问题之后,需要修改权威DNS,将域名指向新的IP地址,但是如果更新太慢,那很多用户都会出现访问异常。

5.解析延迟问题

DNS的查询过程需要本地DNS服务器迭代遍历多个DNS服务器,才能获得最终的解析结果,这会带来一定的时延,甚至会解析超时。

其实归结起来就是两大问题。一是解析速度和更新速度的平衡问题,二是智能调度的问题,对应的解决方案是HTTPDNS的缓存设计调度设计

HTTPDNS的工作模式

HTTPNDS其实就是,不走传统的DNS解析,而是自己搭建基于HTTP协议的DNS服务器集群,分布在多个地点和多个运营商。当客户端需要DNS解析的时候,直接通过HTTP协议进行请求这个服务器集群,得到就近的地址。

HTTPDNS主要适用于手机APP解析域名,因为它必须要通过客户端SDK去实现。

大致流程

  • 获取HTTPDNS服务器IP(这个IP一般不会变,可以在客户端写死。也可以通过传统DNS方式获取IP):在客户端的SDK里动态请求服务端,获取HTTPDNS服务器的IP列表,缓存到本地。随着不断地解析域名,SDK也会在本地缓存DNS域名解析的结果。

  • HTTPDNS服务器解析域名:如果本地没有相同的请求,就需要请求HTTPDNS的服务器,在本地HTTPDNS服务器的IP列表中,选择一个发出HTTP的请求,会返回一个要访问的网站的IP列表。

    请求的方式是这样的。

curl http://106.2.xxx.xxx/d?dn=c.m.163.com
{"dns":[{"host":"c.m.163.com","ips":["223.252.199.12"],"ttl":300,"http2":0}],"client":{"ip":"106.2.81.50","line":269692944}}
  • HTTPDNS服务器进行负载均衡:手机客户端自然知道手机在哪个运营商、哪个地址。由于是直接的HTTP通信,HTTPDNS服务器能够准确知道这些信息,因而可以做精准的全局负载均衡。
  • 客户端访问目标IP:客户端拿到最优IP后,就去访问对应的应用服务器。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-osRGYIPA-1662859878231)(C:\Users\25405\AppData\Roaming\Typora\typora-user-images\image-20220911090634045.png)]

当然,当所有这些都不工作的时候,可以切换到传统的LocalDNS来解析。

HTTPDNS的缓存设计

HTTPDNS就是将解析速度和更新速度全部由客户端SDK控制:

  • 一方面,解析的过程,不需要本地DNS服务递归的调用一大圈,一个HTTP的请求直接搞定,要实时更新的时候,马上就能起作用;
  • 另一方面为了提高解析速度,本地也有缓存,缓存是在客户端SDK维护的,过期时间、更新时间,都可以自己控制。

HTTPDNS的缓存设计策略分为客户端、缓存、数据源三层。

也就是手机客户端、DNS缓存、HTTPDNS服务器。

解析可以同步进行,也就是直接调用HTTPDNS的接口,返回最新的记录,更新缓存;也可以异步进行,添加一个解析任务到后台,由后台任务调用HTTPDNS的接口。

更新也可以使用同步更新优点是实时性好,缺点是如果有多个请求都发现过期的时候,同时会请求HTTPDNS多次,其实是一种浪费;也可以使用异步更新,可以将多个请求都发现过期的情况,合并为一个对于HTTPDNS的请求任务,只执行一次,减少HTTPDNS的压力。同时也可以进行缓存的预加载。

HTTPDNS的调度设计

客户端嵌入了SDK,因而就不会因为本地DNS的各种缓存、转发、NAT,让权威DNS服务器误会客户端所在的位置和运营商,而可以很方便的拿到客户端的真实信息。

客户端:可以知道手机的地址、服务商等信息,HTTPDNS服务端可以根据这些信息,选择最佳的服务节点返回。

如果服务端返回多个IP,就需要客户端使用HTTPDNS返回的IP访问业务应用。客户端的SDK会收集网络请求数据,如错误率、请求时间等网络请求质量数据,并发送到统计后台,进行分析、聚合,以此查看不同的IP的服务质量。并选择最优IP进行访问。

服务端:应用可以通过调用HTTPDNS的管理接口,配置不同服务质量的优先级、权重。HTTPDNS会根据这些策略综合地理位置和线路状况算出一个排序,优先访问当前那些优质的、时延低的IP地址。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FiaaUoNf-1662859878233)(C:\Users\25405\AppData\Roaming\Typora\typora-user-images\image-20220911092755615.png)]

参考:极客时间《趣谈网络协议》

相关文章:

  • ApacheDBUtils的使用
  • 补涨行情的模式如何做?(几天几板模式)
  • 基于Levy飞行策略的改进樽海鞘群算法-附代码
  • 【CSDN高校社区无锡学院】# 新学期,新Flag # 开学季征文活动
  • Linux安装zlib、libpng、freetype给交叉编译工具链使用
  • 深度讲解指针的笔试题目
  • Python 环境安装系统教程——PyCharm
  • 都这麽大了还不快了解防火墙(1)?
  • Code For Better 谷歌开发者之声——谷歌Web工具包(GWT)
  • c++图解内存管理
  • 【微信小程序】自定义组件(二)
  • 基于SSM的水果商城
  • Ubuntu20.04美化成mac OS苹果风格
  • 国际航运管理复习总结题
  • 详解Redis基础数据类型Set增删查(带Java源码)
  • 时间复杂度分析经典问题——最大子序列和
  • 《剑指offer》分解让复杂问题更简单
  • 「面试题」如何实现一个圣杯布局?
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • AHK 中 = 和 == 等比较运算符的用法
  • HTML中设置input等文本框为不可操作
  • Iterator 和 for...of 循环
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • js ES6 求数组的交集,并集,还有差集
  • k个最大的数及变种小结
  • node和express搭建代理服务器(源码)
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Python_网络编程
  • Redis中的lru算法实现
  • vuex 学习笔记 01
  • vue--为什么data属性必须是一个函数
  • 彻底搞懂浏览器Event-loop
  • 订阅Forge Viewer所有的事件
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 区块链分支循环
  • 实现菜单下拉伸展折叠效果demo
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 手机端车牌号码键盘的vue组件
  • 温故知新之javascript面向对象
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • Java总结 - String - 这篇请使劲喷我
  • 国内开源镜像站点
  • !!Dom4j 学习笔记
  • #LLM入门|Prompt#3.3_存储_Memory
  • (¥1011)-(一千零一拾一元整)输出
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (顺序)容器的好伴侣 --- 容器适配器
  • (一)Linux+Windows下安装ffmpeg
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)Mysql的优化设置
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (转)用.Net的File控件上传文件的解决方案
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载