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

近期参与的项目中,依赖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详解

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

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

相关文章

终端安全/SOC安全/汽车信息安全大课来袭-共计204节课

在近两年的时间里&#xff0c;我投入了大量的心血和精力&#xff0c;不仅创作了数千篇精美的图片&#xff0c;还编写了超过1000篇文章&#xff0c;以及数百篇内容丰富的PPT。经过这番努力我终于成功地构建出两套系统化的学习课程&#xff0c;它们分别是“Trustzone/TEE/安全从入…

什么是 CASB,在网络安全中的作用

数字化转型正在稳步攀升&#xff0c;组织现在越来越关注在线生产力系统和协作平台&#xff0c;各行各业的企业都采用了不同的云基础设施服务模式。云基础架构提供按需服务&#xff0c;可提高易用性、访问控制、内容协作和减少内部存储资源&#xff0c;以及许多其他好处。迁移到…

acwing算法基础之搜索与图论--染色法判断二分图

目录 1 基础知识2 模板3 工程化 1 基础知识 二分图&#xff1a;每条边连接的起点和终点&#xff0c;分别属于集合A和集合B。 一个图是二分图&#xff0c;当且仅当&#xff0c;图中不含奇数环&#xff08;即&#xff0c;回环中的结点数目是奇数&#xff09;。 染色法判定二分…

day08_回顾与课程概括

回顾与课程概括 一、上节课复习 一、上节课复习 1、osi七层与数据传输 2、socketsocket是对传输层以下的封装ipport标识唯一一个基于网络通讯的软件3、tcp与udptcp&#xff1a;因为在通信之前必须建立双向连接&#xff0c;通常都是客户端主动连接服务端的&#xff0c;所以必须…

go学习之接口知识

文章目录 接口1.接口案例代码展示2.基本介绍3.基本语法4.应用场景介绍5.注意事项和细节6.接口编程经典案例7.接口与继承之间的比较8.面向对象编程--多态1&#xff09;基本介绍2&#xff09;快速入门3&#xff09;接口体现多态的两种形式 9.类型断言1&#xff09;先看一个需求2&…

登顶request模块

华子目录 Requests介绍安装requests模块常用方法常用属性实例引入各种请求方式基于get请求带参数的get请求推荐写法 基于post请求添加headers信息content获取二进制数据bytes类型获取json数据第一种方式第二种方式 response响应状态码判断 高级操作会话维持通过cookie维持会话通…

【Vue3】scoped 和样式穿透

我们使用很多 vue 的组件库&#xff08;element-plus、vant&#xff09;&#xff0c;在修改样式的时候需要进行其他操作才能成功更改样式&#xff0c;此时就用到了样式穿透。 而不能正常更改样式的原因就是 scoped 标记。 scoped 的渲染规则&#xff1a; <template>&l…

U-Mail邮件中继,让海外邮件沟通更顺畅

在海外&#xff0c;电子邮件是人们主要的通信工具&#xff0c;尤其是商务往来沟通&#xff0c;企业邮箱是标配。这主要是因为西方国家互联网发展较早&#xff0c;在互联网早期&#xff0c;电子邮件技术较为成熟&#xff0c;大家都用电子邮件交流&#xff0c;于是这成了一种潮流…

Android 基本属性绘制文本对象FontMetrics

FontMetrics对象 它以四个基本坐标为基准&#xff0c;分别为&#xff1a; ・FontMetrics.top ・FontMetrics.ascent ・FontMetrics.descent ・FontMetrics.bottom 如图: 要点如下&#xff1a; 1. 基准点是baseline 2. Ascent是baseline之上至字符最高处的距离 3. Descent是ba…

RT-Thread:嵌入式实时操作系统的设计与应用

RT-Thread&#xff08;Real-Time Thread&#xff09;是一个开源的嵌入式实时操作系统&#xff0c;其设计和应用在嵌入式领域具有重要意义。本文将从RT-Thread的设计理念、核心特性&#xff0c;以及在嵌入式系统中的应用等方面进行探讨&#xff0c;对其进行全面的介绍。 首先&a…

Web 安全之时序攻击 Timing Attack 详解

目录 什么是 Timing Attack 攻击&#xff1f; Timing Attack 攻击原理 Timing Attack 攻击的几种基本类型 如何防范 Timing Attack 攻击 小结 什么是 Timing Attack 攻击&#xff1f; Timing Attack&#xff08;时序攻击&#xff09;是一种侧信道攻击&#xff08;timing s…

SMART PLC MODBUSTCP速度测试

SMART PLC MODBUSTCP通信详细介绍请参看下面文章链接: S7-200SMART PLC ModbusTCP通信(多服务器多从站轮询)_matlab sumilink 多个modbustcp读写_RXXW_Dor的博客-CSDN博客文章浏览阅读6.4k次,点赞5次,收藏10次。MBUS_CLIENT作为MODBUS TCP客户端通过S7-200 SMART CPU上的…

chatgpt辅助论文优化表达

chatgpt辅助论文优化表达 写在最前面最终版什么是好的论文整体上&#xff1a;逻辑/连贯性细节上一些具体的修改例子 一些建议&#xff0c;包括具体的提问范例1. **明确你的需求**2. **提供上下文信息**3. **明确问题类型**4. **测试不同建议**5. **请求详细解释**综合提问范例&…

数据结构—二叉树的模拟实现(c语言)

目录 一.前言 二.模拟实现链式结构的二叉树 2.1二叉树的底层结构 2.2通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树 2.3二叉树的销毁 2.4二叉树查找值为x的节点 2.5二叉树节点个数 2.6二叉树叶子节点个数 2.7二叉树第k层节点个数 三.二叉树的遍历 3.1…

linux rsyslog配置文件详解

1.rsyslog配置文件简介 linux rsyslog配置文件/etc/rsyslog.conf分为三部分:MODULES、GLOBAL DIRECTIVES、RULES ryslog模块说明 模块说明MODULES指定接收日志的协议和端口。若要配置日志服务器,则需要将相应的配置项注释去掉。GLOBAL DIRECTIVES主要用来配置日志模版。指定…

ConstraintLayout的基本用法

ConstraintLayout的基本用法 1、基线对齐——Baseline 有时候我们需要这样一个场景&#xff1a; app:layout_constraintBaseline_toBaselineOf"id/30"2、链——Chains 用于将多个控件形成一条链&#xff0c;可以用于平分空间。 <?xml version"1.0"…

【Bug】当用opencv库的imread()函数读取图像,用matplotlib库的plt.imshow()函数显示图像时,图像色彩出现偏差问题的解决方法

一&#xff0c;问题描述 我们在利用opencv的imread读取本地图像&#xff0c;进行一系列处理&#xff0c;但是发现用matplotlib库的imshow&#xff08;&#xff09;函数显示的时候出现色彩改变&#xff0c;比如图像偏黄&#xff0c;偏红&#xff0c;偏蓝等等&#xff0c;但是对…

2023年第十六届山东省职业院校技能大赛中职组“网络安全”赛项规程

第十六届山东省职业院校技能大赛 中职组“网络安全”赛项规程 一、赛项名称 赛项名称&#xff1a;网络安全 英文名称&#xff1a;Cyber Security 赛项组别&#xff1a;中职组 专业大类&#xff1a;电子与信息大类 二、竞赛目的 网络空间已经成为陆、海、空、天之后的第…

AI 时代的企业级安全合规策略

目录 漏洞分类管理的流程 安全策略管理 在扫描结果策略中定义细粒度的规则 有效考虑整个组织中的关键漏洞 确保职责分离 尝试组合拳 本文来源&#xff1a;about.gitlab.com 作者&#xff1a;Grant Hickman 在应用程序敏捷研发、敏捷交付的今天&#xff0c;让安全人员跟上…

神经网络(第二周)

一、简介 1.1 需求预测示例 1.1.1 逻辑回归算法 根据价格预测商品是否畅销。特征&#xff1a;T恤的价格&#xff1b;分类&#xff1a;销售量高1/销售量低0&#xff1b;使用逻辑回归算法进行分类&#xff0c;拟合效果如下图所示&#xff1a; 1.1.2 神经元和神经网络 将逻辑回…