HTTP DNS的工作模式

news2024/11/26 9:32:14

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

这就相当于每家基于 HTTP 协议,自己实现自己的域名解析,自己做一个自己的地址簿,而不使用统一的地址簿。但是默认的域名解析都是走 DNS 的,因而使用 HttpDNS 需要绕过默认的 DNS 路径,就不能使用默认的客户端。使用 HttpDNS 的,往往是手机应用,需要在手机端嵌入支持 HttpDNS 的客户端 SDK。

在客户端的 SDK 里动态请求服务端,获取 HttpDNS 服务器的 IP 列表,缓存到本地。随着不断地解析域名,SDK 也会在本地缓存 DNS 域名解析的结果。

当手机应用要访问一个地址的时候,首先看是否有本地的缓存,如果有就直接返回。这个缓存和本地 DNS 的缓存不一样的是,这个是手机应用自己做的,而非整个运营商统一做的。如何更新、何时更新,手机应用的客户端可以和服务器协调来做这件事情。

如果本地没有,就需要请求 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}}

手机客户端自然知道手机在哪个运营商、哪个地址。由于是直接的 HTTP 通信,HttpDNS 服务器能够准确知道这些信息,因而可以做精准的全局负载均衡。

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

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

HttpDNS 的缓存设计策略也是做应用架构中常用的缓存设计模式,也即分为客户端、缓存、数据源三层。

SDK 中的缓存会严格按照缓存过期时间,如果缓存没有命中,或者已经过期,而且客户端不允许使用过期的记录,则会发起一次解析,保障记录是更新的。

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

同步更新的优点是实时性好,缺点是如果有多个请求都发现过期的时候,同时会请求 HttpDNS 多次,其实是一种浪费。

同步更新的方式对应到应用架构中缓存的 Cache-Aside 机制,也即先读缓存,不命中读数据库,同时将结果写入缓存。

同步更新的方式对应到应用架构中缓存的 Cache-Aside 机制,也即先读缓存,不命中读数据库,同时将结果写入缓存。

异步更新的优点是,可以将多个请求都发现过期的情况,合并为一个对于 HttpDNS 的请求任务,只执行一次,减少 HttpDNS 的压力。同时可以在即将过期的时候,就创建一个任务进行预加载,防止过期之后再刷新,称为预加载。

它的缺点是当前请求拿到过期数据的时候,如果客户端允许使用过期数据,需要冒一次风险。如果过期的数据还能请求,就没问题;如果不能请求,则失败一次,等下次缓存更新后,再请求方能成功。

异步更新的机制对应到应用架构中缓存的 Refresh-Ahead 机制,即业务仅仅访问缓存,当过期的时候定期刷新。在著名的应用缓存 Guava Cache 中,有个 RefreshAfterWrite 机制,对于并发情况下,多个缓存访问不命中从而引发并发回源的情况,可以采取只有一个请求回源的模式。在应用架构的缓存中,也常常用数据预热或者预加载的机制。

此文章为9月Day19学习笔记,内容来源于极客时间《趣谈网络协议》,推荐该课程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1023748.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何构建一个高质量的论文框架

一个高质量的论文框架对于论文撰写非常重要。它可以为你的研究提供一个有序和清晰的结构,突出你的研究贡献,简化写作难度,方便修改和审阅,并提升你的专业形象。因此,建议在撰写论文之前充分考虑并构建一个合适的论文框…

最全测试管理岗面试题(上)

1、怎么改善团队低迷现状? 改善团队低迷的现状是一个重要的管理挑战。以下是一些可能有助于改善团队状态的方法: ① 深入了解问题:首先,需要了解低迷的原因。这可能涉及与团队成员的个人会谈,收集反馈,观…

LeetCode(力扣)63. 不同路径 IIPython

LeetCode63. 不同路径 II 题目链接代码 题目链接 https://leetcode.cn/problems/unique-paths-ii/ 代码 class Solution:def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:m len(obstacleGrid)n len(obstacleGrid[0])if obstacleGrid[m - 1…

【算法】迷宫问题

文章目录 前言1.迷宫问题求解分步骤求解代码 2.迷宫最短路径求解代码 前言 迷宫问题本质就是一个图的遍历问题,从起点开始不断四个方向探索,直到走到出口,走的过程中我们借助栈记录走过路径的坐标。 栈记录坐标有两方面的作用,一…

Java返回日期格式问题

Java返回日期格式问题 解决方式: 方式一:在属性上加入注解,对日期进行格式化,每个都要加,比较繁琐。方式二:在WebMvcConfiguration中扩展Spring MVC的消息转换器,统一对日期类型进行格式化处理…

【第四阶段】kotlin语言的构造函数学习

1.主构造函数 package Kotlin.Stage4 //主构造函数,规范来说,都是增加_xxx的形式,临时的输入类型,不能直接用。需要接收下来,成为变量才能用。 class TestBase(_name:String,_sex:Char,_age:Int,_info:String){ //主…

浮点数运算精度的问题

每日鸡汤:每个你想要学习的瞬间都是未来的你像自己求救 经典面试题,浮点数运算精度的问题,以前一直没有遇到过,今天可算是遇到了,问题是这样的 有一个需求就是一个商品价值164元,然后有一个8折的优惠券&…

想要成为一名优秀的测试工程师,必须要遵守这8个测试原则

测试原则是一个测试人员时刻要铭记在心的,甚至要形成一种本能,指导测试工作。 原则1:测试找不出所有的Bug 软件的复杂性仅次于生命体,甚至现在很多软件都已经有了人工智能的属性。对于这样精妙的系统,一小点异常都有可…

CRM和数字营销什么关系?

crm系统是客户管理系统,主要是用来维护和管理客户关系;数字营销是一种营销策略,用来推广产品和服务。 接下来,将为大家带来crm系统和数字营销关系的深度解析,全文干货! 一、crm是什么? crm系…

c++中关于Thread Affinity(线程亲和性)示例源码

win10下,可以在任务管理器里面设置某个进程的线程亲和性,如下图: 然后选择相关的cpu,如下图: 这么做可以使得相关的线程在某些密集型计算任务中只会运行在某些指定的cpu上,以便提高性能。 以下是windwos上c程序中应用Thread Affi…

接口自动化测试框架postman tests常用方法

postman常用方法集合: 1.设置环境变量 postman.setEnvironmentVariable("key", "value"); pm.environment.set("key", "value");//postman 5.0以上版本设置环境变量的方法 2.设置全局变量 postman.setGlobalVariable(&…

numpy 和 tensorflow 中的各种乘法(点乘和矩阵乘)

嗨喽,大家好呀~这里是爱看美女的茜茜呐 👇 👇 👇 更多精彩机密、教程,尽在下方,赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都准备好了,直接在文末名片自取就可 点乘和矩阵乘…

JavaScript中的基础知识挑战

让我们进一步改进史蒂文的小费计算器,这次使用的是循环! 创建一个包含所有10个测试账单值的数组 “账单”。为小费和总数创建空数组(‘小费’和’总数’)。使用我们之前写的’calcTip’函数(不需要重复)来…

企业内部安全与风控管理图解

企业内部安全说外部安全,企业领导者都非常关注,由于各方面原因,。。。力不从心,妥协! 方向: 1、制度 结合企业实情,编制企业安全管理制度 2、硬件 处理常规硬件外观,加壳与锁定、…

Mybatis工作流程及原理详解

一、概述 1.何为mybatis? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 J…

计算存储是不是智算时代的杀手锏?

想象一下,在一个繁忙的数据中心里,有一家大型互联网公司叫做“数据中心的故事”。这家公司一直在使用传统的CPU架构来处理海量数据。但是随着数据量的不断增长,CPU架构遇到了很多问题和瓶颈,这让“数据中心的故事”感到非常苦恼。…

第一章:最新版零基础学习 PYTHON 教程(第四节 - Python 3 基础知识)

Python 3 是一种流行的高级编程语言,用于各种应用程序。以下是您应该了解的一些 Python 3 基础知识: 变量:在 Python 3 中,变量是通过将值分配给名称来创建的。例如,x 5 创建一个名为 x 的变量,并为其分配…

数据包络分析——SBM模型

写在前面: 博主本人大学期间参加数学建模竞赛十多余次,获奖等级均在二等奖以上。为了让更多学生在数学建模这条路上少走弯路,故将数学建模常用数学模型算法汇聚于此专栏,希望能够对要参加数学建模比赛的同学们有所帮助。 目录 1. …

康耐德视觉检测系统可以在元器件生产中发挥什么作用?

电子元器件作为电子信息产业链的上游产品,是开发通信、计算机及网络、数字音视频等系统和终端产品的基础,电子元部件工作是否可靠决定了电子设备运行是否正常。电子元器件的外观缺陷检测是一个非常关键的部分,因为这类产品一般都比较小。质量…

MyBatis 工具学习笔记(基础)

Whats this 是一款优秀的持久层框架,用于简化 JDBC 开发是 Apache 的一个开源项目 Java EE 三层架构:表现层、业务层、持久层(存储层) (持久层:负责将数据保存到数据库的那一层代码) ORM&…