一次有关 DNS 解析导致 APP 慢的问题探究

news2024/12/24 22:11:41

一、业务背景

HTTTPDNS

AWS Router53

APP 使用 HTTPDNS, 为解决 DNS 解析生效慢, DNS 劫持等问题。

我们 IOS 和安卓都是使用了 HTTPDNS

域名托管在 AWS Router53

域名有多个解析(基于延迟),为了解决就近接入。

示例配置

ai.baidu.com	CNAME	延迟	亚太地区(香港)	alias-ai-hk.baidu.com
ai.baidu.com	CNAME	延迟	默认值 	123455.baidu.com
ai.baidu.com	CNAME	延迟	中国	alias-ai-zh.baidu.com
alias-ai-zh.baidu.com  A - - 18.18.18.18(国内ip接入)

二、 问题

很直观的体现就是, APP 打开很慢。反馈主要是国内的用户。APP 用户面向的群体是全球,所以我们有多个接入。背后通过专线打通。

三、问题排查

不管是从前往后查,还是从后往前查。每个阶段都需要查下。

  1. 用户访问到接入层的网络
  2. 接入层到网关的网络。
  3. 各个服务的耗时。看下链路追踪。

这里也就直接说下我们重点关注的问题的地方: DNS 解析。

3.1、问题一: 基于DNS 延迟的解析

因为我们发现由于是基于DNS 延迟的策略,我发现在深圳通过 HTTPDNS 接口获取对应域名的解析,有很大概率会解析到香港的节点。 我们发现这个并不准确。

然后我们调整为 基于 地理位置 的 路由策略。

ai.baidu.com	CNAME	地理位置	香港	 alias-ai-hk.baidu.com
ai.baidu.com	CNAME	地理位置	默认值 	123455.awsglobalaccelerator.com
ai.baidu.com	CNAME	地理位置	中国	alias-ai-zh.baidu.com
alias-ai-zh.baidu.com  A - - 18.18.18.18(国内ip接入)

我们经过测试,发现这个对应的大陆请求都是解析到大陆的节点。 经过这次调整,我们几个APP 好像打开都快了点(不知道是不是心里作用)。 我们继续往下看。

3.2、问题二:HTTPDNS侧

HTTPDNS基础理论

HTTPDNS 的原理:

原本用户进行 DNS 解析是向运营商的 DNS 服务器发起 UDP 报文进行查询,而在 HTTPDNS 下,修改为用户带上待查询的域名和本机 IP 地址直接向 HTTPDNS 服务器发起 HTTP 请求,这个 HTTPDNS 服务将返回域名解析后的IP地址。那么这个 HTTPDNS 服务器会做什么? 第一 HTTPDNS 获取到请求后,如果当前节点(HTTPDNS 有很多节点) 没有缓存,那么 HTTPDNS 当前节点会向 DNS权威服务器 发起请求获取对应的解析记录。

那么一个域名的 DNS 权威服务器是什么? 我们可以找到我们的域名再对应的 DNS 管理可以看到。我们的 DNS 服务器信息。

[root@185 ~]# dig xiaoaxiao.cn

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.13 <<>> xiaoaxiao.cn
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16195
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;xiaoaxiao.cn.			IN	A

;; AUTHORITY SECTION:
xiaoaxiao.cn.		600	IN	SOA	dns27.hichina.com. hostmaster.hichina.com. 2022052002 3600 1200 86400 600

;; Query time: 261 msec
;; SERVER: ……
;; WHEN: Tue May 30 22:37:28 CST 2023
;; MSG SIZE  rcvd: 105

其中 dns27.hichina.com 和 dns28.hichina.com 就是我们这个域名的对应的权威服务器。

每个域名的权威DNS服务器是指该域名的DNS服务器,它负责管理该域名下的所有DNS记录,包括IP地址、邮件服务器、别名等。权威DNS服务器的作用是回答其他DNS服务器关于该域名的所有DNS查询请求。当用户访问该域名时,他们的计算机会向该域名的权威DNS服务器发送查询请求,以获取与该域名相关的IP地址和其他DNS记录

相关问题

前面讲到 HTTPDNS 会请求 该域名的 DNS 权威服务器, 这里注意我们的域名是托管在AWS 的 router53 上的,也就是该域名对应的 DNS 服务器是 AWS 的在海外的。 注意是海外的。 那么这里有个链路就涉及到跨地域了,我们国内的用户访问 HTTPDNSHTTPDNS服务端 再去访问 AWS 的DNS 服务器,这就涉及到跨地域。我询问了下 httpdns 的技术人员,并让他们给出对比数据。 HTTPDNS服务端 再去访问 AWS 的DNS 服务器 这个延迟会比访问国内的 DNS服务器慢很多。

北京:dp(35ms),aws(110ms);
上海:dp(3ms),aws(61ms);
广州:dp(5ms),aws(90ms);

那么这也是一个慢的原因。

我们继续怀着疑问,那么 HTTPDNS 服务端的节点不会有缓存吗? 如果有缓存的话那也只有第一次会慢。 HTTPDNS对应的技术人员告诉我们目前的策略是,是有缓存的,基于域名的 ttl 值来进行缓存的。当到达 ttl 值的 30% 剩余时间,如果剩余时间内有请求过来,那么会异步去再去请求权威服务器来刷新当前的缓存值。 如果没有请求,则到了ttl 值缓存失效。

  • ttl 值
  • 请求量。

实际测试并不是这个逻辑。 根本没有 30% 的阈值和 异步。说是后期会有。

也就是说,HTTPDNS, 服务端做的缓存只有存在一个基于TTL的缓存,如果你的请求是在TTL 过期的时间后,那么那一次请求 HTTPDNS 会耗时比较久。我测试了几次,第一次获取基本需要400MS左右。

四、优化方向

4.1、域名解析配置

  • 尽量只配置一层解析。或者使用 CNAME 加速

    假设 a.comb.comc.com 都是在 解析的域名:

    域名记录类型记录值
    www.a.comCNAMEwww.b.com
    www.b.comCNAMEwww.c.com
    www.c.comA1.2.3.4

    只配置一层解析也就是 www.a.com 直接 A 记录到具体的 IP

4.2、靠近 HTTPDNS 服务端层

  • 缩减 HTTPDNS 到权威服务器之间的耗时。 把域名切到 DNSPOD 、万网等国内域名商。 AWS(非AWS 中国) Router53 不支持国内 DNS 节点。

  • 调整 TTL 值, 也就是增大 TTL 值,让它在 HTTPDNS 服务端缓存失效的时间变长,时间变长,在相同时间范围内,需要去请求权威服务器的次数也会变少。

  • 增加请求量, 像 HTTPDNS 某个运营商在国内有近 100多个节点。 如果我们的请求量达不到一个层级的话。那么请求到每个节点的请求去命中缓存的概率也会降低。 这样可以通过拨测实现,但是注意,不是直接拨测对应的域名,拨测的应该特定的接口(HTTPDNS 的接口)。 如果直接拨测域名的话,只是改变的公网解析的场景,而改变不了HTTPDNS 的场景。

4.3、靠近用户层

也就是APP 层

  • 减少请求HTTPDNS

    尽量使用缓存的DNS , 不要频繁请求 HTTPDNS

  • 预解析和乐观DNS

    预解析: 绝大多数的 APP 在应用初始化阶段都有一个启动期,我们可以在这个启动期做一些preflight工作,即在初始化阶段我们可以针对业务的热点域名在后台发起异步的 HTTPDNS 解析请求。这部分预解析结果在后续的业务请求中可以直接使用,进而消除首次业务请求的 DNS 解析开销,提升 APP 首页的加载速度。

    乐观DNS: 乐观 DNSOptimistic DNS)是一种基于缓存的 DNS 解析方法,它认为大多数 DNS 查询都会命中缓存,因此不需要每次都向上游 DNS 服务器发送查询请求,而是直接使用本地缓存中的结果。只有在缓存中没有找到对应的解析结果时,才会向上游 DNS 服务器发送请求。

五、扩展

5.1、如何测试本地到权威DNS服务器 获取域名的时间

[root@185 ~]# time dig @ns4.dnsv4.com  www.a.com  
……

real	0m0.074s
user	0m0.006s
sys	    0m0.008s

5.2、 同地区不同网络,访问HTTPDNS 会不会命中缓存。

比如同一个手机,不同的网络,切换 联通到电信 在TTL 时间范围内,访问 HTTPDNS(腾讯云) 会不会命中缓存?
比如后面的 DNS 配置只配置了,基于地理位置的逻辑的配置。 比如 国内 到 A , 国外到 B. 在这个场景下 会不会命中缓存? 可以想一想?

经过确认, 腾讯云的HTTPDNS 是 同一个地域(省或者直辖市)+同一个运营商,会命中同一个缓存。 但是注意,同一个地域的 HTTPDNS 后端节点有多个,可能请求会到不同的节点,也可能命中不了缓存。

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

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

相关文章

网易Java后端面经(一面)

这是网易的Java一面&#xff0c;问的都很基础。 1.session过期怎么处理&#xff1f; session过期通常指用户在一段时间内没有进行任何操作而导致session失效。针对这种情况&#xff0c;可以采取以下措施&#xff1a; 1. 前端提示用户session即将过期&#xff0c;提醒其重新登录…

JavaScript对象的增强知识

Object.defineProperty ◼ 在前面我们的属性都是直接定义在对象内部&#xff0c;或者直接添加到对象内部的&#xff1a;  但是这样来做的时候我们就不能对这个属性进行一些限制&#xff1a;比如这个属性是否是可以通过delete删除的&#xff1f;这个属性是否在for-in遍历的时候…

微信能取代对讲机吗?区别在哪?

对讲机和微信的区别在哪&#xff1f;为什么大家在通讯方面选择对讲机而不是微信&#xff1f; 微信作为社交软件在多个领域都有着广泛的应用&#xff0c;不过在对讲机行业也在讨论一个话题&#xff1a;微信能否取代对讲机&#xff1f;下面河南宝蓝小编就和大家聊聊这个话题。 …

基于redis实现秒杀并防止超卖

基于redis实现秒杀并防止超卖 为什么基于redis针对秒杀商品库存为一个的情况setnx代码实现测试 针对有多个库存的商品实现测试 为什么基于redis 因为所有redis的操作&#xff08;这里指的是key的操作&#xff0c;像备份落盘之类的另算&#xff09;都是单线程的&#xff0c;所以…

一文读懂:LoRA实现大模型LLM微调

LoRA大模型LLM微调 为什么要进行微调&#xff1f;LoRA思路提高权重更新效率选择低的秩 实现LoRALoRA在LLaMA实现 为什么要进行微调&#xff1f; 在快速发展的人工智能领域中&#xff0c;以高效和有效的方式使用大型语言模型变得越来越重要。 预训练的大型语言模型通常被称为优…

02-启动 Vue 项目

一. 学习目标 掌握 Vue 项目的启动 二. 学习内容 掌握 Vue 项目的启动 三. 学习过程 项目的启动也有两种方式&#xff0c;一种是通过图形界面启动&#xff0c;另一种是通过命令行启动。 1.图形界面 打开vscode编辑器&#xff0c;点击 1.文件 ——>打开文件夹&#xff0c…

springboot实现支付宝支付(沙箱环境)

springboot实现支付宝支付 1. 获取应用id,应用私钥和支付宝公钥2. 开始开发3. 内网穿透4. 测试支付功能 1. 获取应用id,应用私钥和支付宝公钥 进入支付宝控制台:https://open.alipay.com/develop/manage 找到沙箱 这里可以看到应用id 可以看到应用私钥和支付宝公钥,获取这…

Zoho:集成ChatGPT、开发大型语言模型,加紧布局AI+SaaS

在企业的数字化转型进程中&#xff0c;管理层和员工的数字化意识会随着建设的推进而不断提高&#xff0c;对于办公场景的数字化应用需求也不断产生。传统的办公系统建设中&#xff0c;系统的应用能力需要支撑越来越丰富的场景需求。 《今日人工智能》采访到Zoho中国VP兼SaaS事业…

【编程语言 · C语言 · for语句】

for 语句 C语言中&#xff0c;使用for语句也可以控制一个循环&#xff0c;并且在每一次循环时修改循环变量。在循环语句中&#xff0c;for语句的应用最为灵活&#xff0c;不仅可以用循环次数已经确定的情况&#xff0c;而且可以用于循环次数不确定而只给出循环结束条件的情况。…

jenkins构建pipline无法执行shell命令原因

问题表现 新的服务器上&#xff0c;新安装的jenkins&#xff0c;在上面创建了一个pipline项目&#xff0c;脚本里有shell命令&#xff0c;但是jenkins每次执行都卡住&#xff0c;经过尝试&#xff0c;无论多简单的命令都执行不了&#xff0c;cp&#xff0c;mv等都不行&#xf…

华为路由器:ospf协议三张表及邻居建立过程

说明&#xff1a;本篇接上一篇继续讲解 拓扑图 为了方便&#xff0c;我把R1/2/3/4/5的router id改成了回环网卡的IP。 ospf协议三张表 邻居表&#xff08;neighbortable&#xff09; OSPF用邻居机制来发现和维持路由的存在&#xff0c;邻居表存储了双向通信的邻居关系OSPF路…

矩形图:数据之美在图形中展现

在当今信息爆炸的时代&#xff0c;数据已经成为决策和洞察的重要基石&#xff0c;但海量的数据如果不经过整理和呈现&#xff0c;往往难以得出有意义的结论。这时候&#xff0c;可视化工具的作用就变得尤为重要了。在众多可视化形式中&#xff0c;矩形图以其简洁直观的特点受到…

团队管理之性能实施团队日志9

最近项目进入胶着状态。 混合场景在有些项目组里已经可以开始了&#xff0c;但还是有两三个项目组现在是完全没办法混合起来的。 本周计划是把基准测试、容量测试跑完&#xff0c;稳定性测试每个项目组至少能跑一遍。 但是从进度上来看&#xff0c;容量测试至少有四个系统不能跑…

各类动态路由协议汇总简介

目录 一、前言 二、OSPF协议 &#xff08;一&#xff09;OSPF是什么 &#xff08;二&#xff09;OSPF的工作原理 &#xff08;三&#xff09;OSPF的特点 &#xff08;四&#xff09;OSPF的使用 &#xff08;五&#xff09;OSPF的优点 &#xff08;六&#xff09;总结 …

ROS——从深度图转换到octomap(C++)

文章目录 介绍环境准备三维灰度栅格图三维RGB栅格图对点云进行过滤处理参考介绍 八叉树是用于在3D视觉中细分空间的数据结构。每个立方体都可以逐级地细分为8个子立方体,直到达到了给定的最小体积(体素)尺寸。且该最小体积(体素)决定了八叉树的分辨率。 octomap的作用:…

代码随想录算法训练营第五十一天|309.最佳买卖股票时机含冷冻期|714.买卖股票的最佳时机含手续费

LeetCode309.最佳买卖股票时机含冷冻期 动态规划五部曲&#xff1a; 1&#xff0c;确定dp数组以及下标的含义&#xff1a;dp[i][j]&#xff0c;第i天状态为j&#xff0c;所剩的最多现金为dp[i][j]。出现冷冻期之后&#xff0c;状态其实是比较复杂度&#xff0c;例如今天买入股…

接口自动化【七】__包装响应结果的数据为key-value

文章目录 前言 一、本章学习的思路 二、用接口新建商品_使用步骤 ​​​​​​​步骤一&#xff1a;先用抓包的方式拿到新建商品的接口 步骤二&#xff1a;我们先用单接口的形式&#xff0c;把这个商品添加成功 三、处理响应接口_&#xff08;包装响应结果的数据为&#xf…

Flume自定义拦截器 - ETL拦截器和分类拦截器

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 目录 一、拦截器&#xff08;Interceptor&#xff09;和选择器&#xff08;Selector&#xff09; 拦截器&#xff08;Interceptor&#xff09; 选择器&#xff08;Selector&#xff09; 二、自定…

【机器学习 | 深度学习】Colab是什么?以及如何使用它?

文章目录 一、介绍二、如何使用 Colaboratory 创建代码三、实例测试 一、介绍 Colaboratory&#xff08;简称为Colab&#xff09;是由Google开发的一种基于云端的交互式笔记本环境。它提供了免费的计算资源&#xff08;包括CPU、GPU和TPU&#xff09;&#xff0c;可让用户在浏…