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

在应用内维护域名缓存时遇到的问题

近期参与的项目中,依赖DNS服务器来解析外部的业务集群,遇到了一连串的问题。
远端的业务集群基于HTTP/HTTPS协议,提供业务服务,集群中包含了多个业务节点,当前方案中在DNS服务器上配置域名,指向业务集群中的多个业务节点。
DNS服务器由客户提供。
产品的特性代码中使用libcurl来访问业务集群提供的HTTP/HTTPS的服务。
在本地开发、验证过程中,上述组网方式没有什么问题,一切都很美好。
结果进入大规模测试阶段时,暴露了一个严重的问题:由于产品的并发度比较高,特性开启后,在短时间内会触发大量的业务请求。这导致如下后果:

  1. libcurl代码发起了大量的域名解析请求,DNS服务器的并发能力不足,只能选择性回复部分报文。
  2. 大量请求由于建立链接时因域名解析失败而失败。
  3. 由于产品内建了重试逻辑,于是引发了更多的请求。
  4. 于是DNS不堪重负,拒绝了更多的域名解析请求。
  5. 结果其它依赖DNS解析域名的业务,同样受到了波及。

测试团队反馈了上述问题之后,开发团队做如下几件事情:

  1. 在现有的重试逻辑中,增加了休眠时间,使用指数退减的方式,逐次增加重试之间的间隔时间,避免大量请求扎堆。经过实测,本策略缓解了问题,但并没有解决问题。
  2. 修改libcurl的使用方法,启用了DNS缓存特性,并增大了缓存的失效时间。经过实测,本策略的效果不明确。
  3. 修改产品的业务代码,降低并发度。本策略实施后有明显的效果,失败的请求次数明显下降,考虑到产品的代码中,存在多个特性使用libcurl访问远端集群的服务,本问题依然存在。

上述策略都是小打小闹,并没有从根本上解决问题。
开发团队内部组织讨论,重新讨论,得出如下结论:

  • 降低并发度不可行。
    一方面可能导致当前特性的性能规格不达标。另外前期多个特性均在使用libcurl,各个业务都按照相同的策略去降低并发度,修改、验证的工作量巨大,管理团队无法接受,开发、测试团队同样觉得疲惫,难以为继。
  • DNS服务器的并发能力不可预期。
    交付场景下,DNS服务器由客户提供,其并发能力不可预期,短时间内也不可能提升性能,假如由于本产品的原因占满了客户DNS服务器的处理能力,可能会阻塞客户的其它业务,因此仍然需要直面问题。

开发团队经过讨论,有如下决策:

  • 收编现有业务代码中libcurl的使用,对各特性提供统一的HTTP协议客户端。
  • 在上述客户端的代码中增加域名解析结果的缓存。

这个方案工作量不大,很快通过了测试团队组织的功能验证、性能验证。
本来觉得未来一片光明,但测试团队在执行故障注入的用例时,发现了新的问题,域名解析操作执行时间过久,单次调用居然要20+秒才能返回。

这个新问题和前述方案中域名解析的实现相关,换句话说,这是域名解析的C函数的坑。
目前已知的用于完成域名解析的C函数,如下:

  • gethostbyname线程不安全,排除。
  • gethostbyname_rgethostbyname的线程安全版本,当前在用。

从实际测试的结果来看,发现gethostbyname_r存在一个严重的问题,函数的参数中不能指定超时值,导致耗时不可控。
查阅了大量资料之后,发现耗时的问题其实和DNS域名解析的过程相关,不能怪设计API的前辈不用心。
虽然不能在调用gethostbyname_r时传入超时值,但无意中发现了/etc/resolv.conf。通过修改options attempts:5 timeout:6中的attemptstimeout,发现在一定程度上可以缓解在DNS故障场景下调用gethostbyname_r函数耗时过长的现象。

经过一系列折腾,目前的解决方案虽不完美,但至少获得了产品团队的认可,因此优化工作暂告一段落。

如下是处理前述问题过程中,使用到的配置文件或者工具。

/etc/resolv.conf文件的内容样例,如下:

$ cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
# 127.0.0.53 is the systemd-resolved stub resolver.
# run "systemd-resolve --status" to see details about the actual nameservers.nameserver 127.0.0.53
search DHCP HOST
options attempts:5 timeout:6

/etc/hosts文件的样例,如下:

$ cat /etc/hosts
127.0.0.1	localhost
127.0.1.1	jackie-ubuntu# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

dig命令的执行输出,样例如下:

$ dig www.baidu.com; <<>> DiG 9.16.1-Ubuntu <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56073
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;www.baidu.com.			IN	A;; ANSWER SECTION:
www.baidu.com.		1105	IN	CNAME	www.a.shifen.com.
www.a.shifen.com.	29	IN	A	36.152.44.96
www.a.shifen.com.	29	IN	A	36.152.44.95;; Query time: 4 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: 日 1112 11:15:58 CST 2023
;; MSG SIZE  rcvd: 101

dig+trace的选项,执行输出,样例如下:

$ dig +trace www.baidu.com; <<>> DiG 9.16.1-Ubuntu <<>> +trace www.baidu.com
;; global options: +cmd
.			2687	IN	NS	f.root-servers.net.
.			2687	IN	NS	m.root-servers.net.
.			2687	IN	NS	e.root-servers.net.
.			2687	IN	NS	l.root-servers.net.
.			2687	IN	NS	c.root-servers.net.
.			2687	IN	NS	h.root-servers.net.
.			2687	IN	NS	j.root-servers.net.
.			2687	IN	NS	a.root-servers.net.
.			2687	IN	NS	k.root-servers.net.
.			2687	IN	NS	g.root-servers.net.
.			2687	IN	NS	i.root-servers.net.
.			2687	IN	NS	d.root-servers.net.
.			2687	IN	NS	b.root-servers.net.
;; Received 262 bytes from 127.0.0.53#53(127.0.0.53) in 12 mscom.			172800	IN	NS	a.gtld-servers.net.
com.			172800	IN	NS	b.gtld-servers.net.
com.			172800	IN	NS	c.gtld-servers.net.
com.			172800	IN	NS	d.gtld-servers.net.
com.			172800	IN	NS	e.gtld-servers.net.
com.			172800	IN	NS	f.gtld-servers.net.
com.			172800	IN	NS	g.gtld-servers.net.
com.			172800	IN	NS	h.gtld-servers.net.
com.			172800	IN	NS	i.gtld-servers.net.
com.			172800	IN	NS	j.gtld-servers.net.
com.			172800	IN	NS	k.gtld-servers.net.
com.			172800	IN	NS	l.gtld-servers.net.
com.			172800	IN	NS	m.gtld-servers.net.
com.			86400	IN	DS	30909 8 2 E2D3C916F6DEEAC73294E8268FB5885044A833FC5459588F4A9184CF C41A5766
com.			86400	IN	RRSIG	DS 8 1 86400 20231124170000 20231111160000 46780 . rTOgKkj9DMvMzyk+rKDz7dsie4Xx1jwuBlZdH9ntLEikavNoZMRN7SxE iweiVanZo1q9hhrSxAn8O1ScKkRwwHTSCiSvQnZ8bzy4ToM3I832VIiR Oir+C+K7GtufMaxNCOmD14s7Zg24qLf9CmQT+id3eIBMP4Sjuq4MSIsu tgSXJS6EI1OumSojANeO9mq1khc5cxLaeOqJfRb10Vvujl73jZpaXxE9 J4/GehjpG6YR04/37geOwOSaVwx6c3PndgT0L33O/maN/Tjng2UUhHtW lOh8gIVxFYRipqdDZ1XJQK+x5o4o8Oh3YN3Vd1I5rrKJhEfwecej7nyI fe5BKA==
;; Received 1173 bytes from 199.7.83.42#53(l.root-servers.net) in 20 msbaidu.com.		172800	IN	NS	ns2.baidu.com.
baidu.com.		172800	IN	NS	ns3.baidu.com.
baidu.com.		172800	IN	NS	ns4.baidu.com.
baidu.com.		172800	IN	NS	ns1.baidu.com.
baidu.com.		172800	IN	NS	ns7.baidu.com.
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN NSEC3 1 1 0 - CK0Q2D6NI4I7EQH8NA30NS61O48UL8G5 NS SOA RRSIG DNSKEY NSEC3PARAM
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN RRSIG NSEC3 8 2 86400 20231118052525 20231111041525 63246 com. HHilTlIgM2bBSkNCrfIYydeweb7FpcSd/HCPjoMq9cDoI45LnU1trxYf GtncYfSgPxd01lt7BuBdTBRjFX2kHEWQNAjqKR+wj9ohk9mqvk3naenD eWVPwSEZjYdV+LPjL7rXvMWq6GRZXFG2OC0oR37mS4PCPT/pWYTARo7m 66PiR/ixIP8UPkUbxjZTHFuDsR+lywg8Od0OsTopTj5+rw==
HPVV1UNKTCF9TD77I2AUR73709T975GH.com. 86400 IN NSEC3 1 1 0 - HPVVAN8CFKHHHMEIDVJHFNQEOI5G6C89 NS DS RRSIG
HPVV1UNKTCF9TD77I2AUR73709T975GH.com. 86400 IN RRSIG NSEC3 8 2 86400 20231115212015 20231108201015 63246 com. jtcfLKFI33jWF+yVS/iT/x73j+JM7gult+JQD6xHY0yl4ZWp2ktqwCrA wk8ybADERvnpDU/u9LKgBVGkT7rIDnheKGcXzKe5Lgjilu9aHWjIiyny J/kwYkBe+XCqXofFrkq5QS/El4Esu4Hp7FCUAm5lRMNlGL8H9QrdqESl G4NIUZFsyhqj3Ulz0/u1QjPRm13QmKOuUh/DvWhj63Ru5g==
;; Received 849 bytes from 192.48.79.30#53(j.gtld-servers.net) in 284 mswww.baidu.com.		1200	IN	CNAME	www.a.shifen.com.
;; Received 100 bytes from 36.155.132.78#53(ns3.baidu.com) in 8 ms

nslookup命令的执行输出,样例如下:

$ nslookup www.baidu.com
Server:		127.0.0.53
Address:	127.0.0.53#53Non-authoritative answer:
www.baidu.com	canonical name = www.a.shifen.com.
Name:	www.a.shifen.com
Address: 36.152.44.96
Name:	www.a.shifen.com
Address: 36.152.44.95
Name:	www.a.shifen.com
Address: 2409:8c20:6:1d55:0:ff:b09c:7d77
Name:	www.a.shifen.com
Address: 2409:8c20:6:1135:0:ff:b027:210c

相关资料

  • resolv.conf(5)
  • Linux DNS 解析与配置 nslookup使用 与 /etc/resolv.conf文件的配置
  • 浅析resolv.conf常用参数
  • Linux /etc/resolv.conf文件解析
  • REHL7/CentOS7 中/etc/resolv.conf 详解
  • 用resolvconf配置DNS服务器
  • dns配置文件/etc/resolv.conf中search和options ndots详解
  • Linux /etc/resolv.conf文件说明
  • 域名解析——gethostbyname()函数及socket客户端域名解析
  • gethostbyname()函数详解
  • gethostbyname()、getaddrinfo()函数基本情况
  • 关于gethostbyname_r的参数及返回值
  • gethostbyname 和 gethostbyname_r(可重入的)得到dns信息
  • 【UNP笔记】第十一章 名字地址转换
  • gethostbyname_r的注意事项
  • C++ gethostbyname_r函数代码示例
  • 如何在linux中使用gethostbyname_r
  • DIG域名解析查询工具
  • 掌握 DNS 查询技巧,dig 命令基本用法
  • DNS篇之dig使用详解
  • linux 【网络】dig查询DNS详解

相关文章:

在应用内维护域名缓存时遇到的问题

近期参与的项目中&#xff0c;依赖DNS服务器来解析外部的业务集群&#xff0c;遇到了一连串的问题。 远端的业务集群基于HTTP/HTTPS协议&#xff0c;提供业务服务&#xff0c;集群中包含了多个业务节点&#xff0c;当前方案中在DNS服务器上配置域名&#xff0c;指向业务集群中的…...

网络支付安全:面临的风险与防范策略

随着电子商务的繁荣和移动支付技术的发展&#xff0c;网络支付已成为全球消费者日常生活中不可或缺的一部分。然而&#xff0c;这种便捷的支付方式也带来了许多安全风险&#xff0c;这些风险可能威胁到用户的财务安全和个人隐私。本文将深入探讨网络支付面临的主要安全风险&…...

『亚马逊云科技产品测评』活动征文|阿里云服务器亚马逊服务器综合评测

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 文章目录 引言一、亚马逊&阿里云发展历史介绍1.1 亚马逊发展历史1.2…...

javascript原来还可以这样比较两个日期(直接使用new Date)

有个需求是这样的&#xff1a;假设今天是2023/11/15 有一个表格&#xff0c;表格中操作列按钮的展示与隐藏依靠开始结束日期来进行展示&#xff0c;如果当前日期在开始结束日期之间&#xff0c;则进行展示&#xff0c;我一开始做的时候使用new Date转换成时间戳(getTime)进行比…...

[云原生案例2.4 ] Kubernetes的部署安装 【通过Kubeadm部署Kubernetes高可用集群】

文章目录 1. 基本架构及前置准备1.1 基本架构1.2 前置准备 2. 系统初始化操作 ---- 所有节点2.1 关闭防火墙、selinux和swap分区2.1.1 关闭防火墙和selinux2.1.2 关闭交换分区 2.2 修改主机名&#xff0c;添加域名映射2.2.1 修改主机名2.2.2 修改本地hosts文件 2.3 内核升级2.4…...

PP-ChatOCRv2、PP-TSv2、大模型半监督学习工具...PaddleX新特性等你来pick!

小A是一名刚刚毕业的算法工程师&#xff0c;有一天&#xff0c;他被老板安排了一个活&#xff0c;要对一批合同扫描件进行自动化信息抽取&#xff0c;输出结构化的分析报表。OCR问题不大&#xff0c;但是怎么进行批量的结构化信息抽取呢&#xff1f;小A陷入了苦苦思索… 小B是…...

HarmonyOS 学习记录

时光荏苒,岁月如梭,韶华不负,未来可期。转眼间已经30岁了&#xff0c;学习的重要性不言而喻&#xff0c;在接下来的日子里记录下自己学习HarmonyOS的过程。增加一下知识储备&#xff0c;防患于未然嘛 不得不说华为的开发文档写的不错&#xff0c;开发工具直接安装后自动配置环境…...

阿里云 业务集群的冗余、备份、监控方案

1. 请解释什么是业务集群的冗余、备份和监控&#xff1f; 一、冗余方案 硬件冗余&#xff1a;在业务集群中&#xff0c;关键设备如服务器、存储设备等应采用双机热备或集群技术&#xff0c;确保在某台设备出现故障时&#xff0c;其他设备能够自动接管工作&#xff0c;保证业务…...

无人驾驶的未来 后疫情时代如何抵达

作者 | 马冀&#xff0c;澳鹏&#xff08;Appen&#xff09;中国区副总裁 自动驾驶—疫情危难中显身手 2020年&#xff0c;一场突如其来的新冠肺炎肆虐全球, 导致不同国家的人们被迫隔离或保持社交距离&#xff0c;人与人之间的接触变得风险极高。一时间&#xff0c;人们对于…...

(论文阅读31/100)Stacked hourglass networks for human pose estimation

31.文献阅读笔记 简介 题目 Stacked hourglass networks for human pose estimation 作者 Alejandro Newell, Kaiyu Yang, and Jia Deng, ECCV, 2016. 原文链接 https://arxiv.org/pdf/1603.06937.pdf 关键词 Human Pose Estimation 研究问题 CNN运用于Human Pose E…...

【第2章 Node.js基础】2.6 Node.js 的Buffer数据类型

Buffer数据类型 文章目录 Buffer数据类型什么是Buffer数据类型Buffer 的特点 创建Buffer实例Buffer用于编码转换将Buffer 实例转换为JSON 对象Buffer实例基本操作1. 写入Buffer实例&#xff1a;2. 从Buffer实例读取数据&#xff1a;3. Buffer实例合并&#xff1a; 4. Buffer实例…...

reactive和effect,依赖收集触发依赖

通过上一篇文章已经初始化项目&#xff0c;集成了ts和jest。本篇实现Vue3中响应式模块里的reactive方法。 前置知识要求 如果你熟练掌握Map, Set, Proxy, Reflect&#xff0c;可直接跳过这部分。 Map Map是一种用于存储键值对的集合&#xff0c;并且能够记住键的原始插入顺…...

【C#学习】backgroundWorker控件

BackgroundWorker 控件的几个实例&#xff08;C# backgroundworker使用方法&#xff09;&#xff1a; 在 WinForms 中&#xff0c;有时要执行耗时的操作&#xff0c;在该操作未完成之前操作用户界面&#xff0c;会导致用户界面停止响应。 解决的方法就是新开一个线程&#xff…...

Istio学习笔记-部署模型

参考&#xff1a;Istioldie 1.18 / 部署模型 当您将 Istio 用于生产环境部署时&#xff0c;需要确定一系列的问题。 网格将被限制在单个集群中还是分布在多个集群中&#xff1f; 是将所有服务都放置在单个完全连接的网络中&#xff0c;还是需要网关来跨多个网络连接服务&#…...

磁盘调度算法

磁盘调度算法是计算机操作系统中用于管理磁盘上的数据访问的重要组成部分。这些算法有助于优化数据的读写操作&#xff0c;以减少磁盘访问时间&#xff0c;提高系统性能。以下是一些常见的磁盘调度算法&#xff1a; 先来先服务&#xff08;FCFS&#xff0c;First-Come-First-Se…...

力扣题库2. 两数相加

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 开…...

【Linux】第十六站:进程地址空间

文章目录 一、程序地址空间1.内存的分布2.static修饰后为什么不会被释放3.一个奇怪的现象 二、进程地址空间1.前面现象的原因2.地址空间究竟是什么&#xff1f;3.为什么要有进程地址空间4.页表5.什么叫进程&#xff1f;6.进程具有独立性。为什么&#xff1f;怎么做到呢&#xf…...

基于Springboot的影城管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的影城管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 项目介绍…...

如何在面试中胜出?接口自动化面试题安排上

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…...

联邦学习研究综述笔记

联邦学习 联邦学习的定义&#xff1a;联邦学习是一种分布式机器学习架构&#xff0c;包含多个客户端&#xff08;参与者&#xff09;和一个聚合服务器。客服端&#xff08;参与方&#xff09;&#xff1a;在本地使用自己的私有数据训练模型&#xff0c;训练完成之后将模型的参…...

RedisTemplate乱码问题

其实这是在解决一个项目问题是发现的&#xff0c;因为原开发者的大意&#xff0c;造成了系统出现严重的逻辑问题。 因为系统系统采用分模块开发&#xff0c;某模块使用Spring提供的RedisTemplate进行值的读写&#xff0c;另一位使用了框架基于Jedis的一套公用方法进行值的读写…...

Java用户和内核交互图

...

2023.11.14使用bootstrap制作一个简洁的前端注册登录页

2023.11.14使用bootstrap制作一个简洁的前端注册登录页 比较简洁的登录页&#xff0c;主要是为自己开发的一些平台页面做测试用&#xff0c;前端具备功能如下&#xff1a; &#xff08;1&#xff09;输入用户名、密码&#xff0c;需补充后端验证代码。 &#xff08;2&#xff…...

Avatar虚拟形象解决方案,趣味化的视频拍摄与直播新体验

企业们正在寻找新的方式来吸引和保持观众的注意力,一种新兴的解决方案就是使用Avatar虚拟形象技术&#xff0c;这种技术可以让用户在视频拍摄或直播场景中&#xff0c;以自定义的数字人形象出现&#xff0c;同时保持所有的表情和脸部驱动。美摄科技正是这个领域的领军者&#x…...

MongoDB备份与恢复以及导入导出

MongoDB备份与恢复 1、mongodump数据备份 在Mongodb中我们使用mongodump命令来备份MongoDB数据。该命令可以导出所有数据 (数据和数据结构) 或指定数据&#xff08;集合、部分集合内容&#xff09;到指定目录中。 语法&#xff1a; mongodump -h dbhost -d dbname -o dbdirec…...

如何挑选猫主食罐头?宠物店自用的5款猫主食罐头推荐!

临近双十二大促&#xff0c;是时候给家里的猫主子屯猫主食罐头了。许多铲屎官看大促的各种品牌宣传&#xff0c;看到眼花缭乱&#xff0c;不知道选哪些猫主食罐头好&#xff0c;胡乱选又怕踩坑。 猫罐头侠闪亮登场&#xff01;如何挑选猫主食罐头&#xff1f;作为经营宠物店7年…...

立哥先进研发-API安全方案

项目背景&#xff1a;随着技术进步&#xff0c;很多优秀技术也被用在黑灰产之中&#xff0c;例如爬虫系统在票务系统中的滥用&#xff0c;尤其机票系统。机票爬虫们威力之大&#xff0c;让人叹为观止&#xff1a;多数订票网站&#xff0c;真实用户产生的不到10%&#xff0c;其浏…...

小函数:Lambda表达式(Java篇)

Lambda表达式的使用场景&#xff1a;用以简化接口实现。 关于接口实现&#xff0c;可以有很多种方式来实现。例如&#xff1a;设计接口的实现类、使用匿名内部类。 但是lambda表达式&#xff0c;比这两种方式都简单&#xff01; lambda表达式毕竟只是⼀个匿名方法。当实现的接…...

RSS订阅快速连接Notion

数环通让您可以通过不到几分钟的时间即可实现RSS订阅与Notion的对接与集成&#xff0c;从而高效实现工作流程自动化&#xff0c;降本增效&#xff01; 1.产品介绍 RSS订阅是数环通的内置应用&#xff0c;很多用户通过RSS订阅来收集自己在各大平台上看的内容&#xff0c;当RSS…...

VMware ubuntu 新虚拟机的创建

根据自己指定的路径安装好vm后。 创建新的虚拟机。 记录一下&#xff0c;下次用到别再忘记了。 如需转载&#xff0c;注明出处&#xff01; 点赞收藏关注我 以资鼓励 打开vm 软件&#xff0c;点击创建新的虚拟机 选择典型&#xff0c;点击下一步 选择你的ubuntu镜像iso文件 …...