你所不知道的端口耗尽(三)

问题背景

在你所不知道的端口耗尽前面的两篇章节中,介绍了经典的客户端端口耗尽和SNAT端口耗尽问题,但是对于解决方案只是一笔带过,这篇文章会更详细的介绍解决方案。解决方案主要分为两大类,优化部署和优化应用程序。

优化部署

本篇主要介绍在Azure上的部署以及主要是Azure集群的部署,针对的是SNAT端口耗尽问题。

Load Balancer增加前端IP

在(二)中详细介绍过,Load Balancer的每个前端IP可提供64K的端口,如果端口耗尽问题发生,最直接的方法是新增可用的IP。

Load Balancer调整出站规则

Load Balancer的默认出站规则是根据后端池大小分配 SNAT 端口。具体如下:

如果按照默认的出站规则,最大才1024,明显不符合大规模产品的需求,所以一般需要调整为手动端口分配,ports per instance。例如,若已知后端池中最多有 10 个 VM,则可以为每个 VM 最多分配 6,400(64000/10) 个 SNAT 端口,而不是默认的 1,024 个。

使用NAT网关

Azure 负载均衡器将固定数量的 SNAT 端口分配给后端池中的每个虚拟机实例。 这种分配方法可能会导致 SNAT 耗尽,尤其遇到流量模式不均衡导致特定虚拟机发送更高的传出连接量的情况。 与负载均衡器不同,NAT 网关在子网中的所有 VM 实例之间动态分配 SNAT 端口。

NAT 网关让子网中的每个实例都可以使用 SNAT 端口。 利用此动态分配,VM 实例可从可用端口池中使用每个实例所需数量的 SNAT 端口进行新连接。 动态分配可降低 SNAT 耗尽的风险

image

另外,NAT 网关从可用端口池中随机选择端口。 如果没有可用的端口,只要没有与同一目标公共 IP 和端口的现有连接,就会重复使用 SNAT 端口。 NAT 网关的此端口选择和重用行为使得遇到连接超时的可能性较低。

优化应用程序

重复使用连接

建议将应用程序配置为重复使用连接,而不是为每个请求生成单独的原子 TCP 连接。这里介绍一个最典型的例子,net core中的HttpClient,对外部网络的请求使用单instance或者使用HttpClientFactory,如果每个请求都构造一个HttpClient,那么即使同一目标公共 IP 和端口,也会分配不同的端口,这样端口很快就会消耗殆尽。

使用连接池

在应用程序中使用连接池方案,其在一组固定的连接中内部分布请求,并且在可能的情况下,重复使用这些请求。连接池一般存在于正在使用的框架中,所以技术选型和SDK时,一定要非常注意是否有连接池。

另外,也可以根据情况调整连接池的最大连接数。

使用节制的重试逻辑方案

当 端口耗尽或应用程序故障发生时,无衰减或回退逻辑的积极重试或暴力重试会使耗尽状况再次发生或一直持续。如果重试过于频繁,则连接可能没有足够的时间关闭和释放 SNAT 端口以供重复使用。 使用节制的重试逻辑,可以降低对端口的需求。

  • 延时重试: 系统可能会在失败后等待一段时间,之后再尝试执行相同的操作。这样做的目的是给予系统或目标资源一些恢复时间。

  • 退避算法: 采用退避算法(如指数退避)来决定两次重试尝试之间的等待时间。例如,每次尝试失败后,系统会将等待时间翻倍,以减少对系统的冲击和避免潜在的连续失败。

  • 限制重试次数: 为了避免无限重试,可能会设置一个最大重试次数的限制。一旦达到这个限制,系统将放弃重试,并可能采取其他处理措施,如发送警告或切换到备份方案。

  • 智能判断: 重试逻辑可能还会包含对当前状态和环境的评估,只有在条件看起来有可能改善时才进行重试。

  • 随机化和分散: 在分布式系统中,如果多个实例几乎同时遇到问题并进行重试,可能会造成资源争用或"flood"效应。因此,引入随机化因素使得重试尝试更加分散可以减少这种风险。

文章转载自:牛角挂书i

原文链接:https://www.cnblogs.com/kyo-lynn/p/18050538

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

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

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

相关文章

Unity2013.1.19_DOTS_Burst compiler

Unity2013.1.19_DOTS_Burst compiler DOTS是一种新产品,现在尚在起步阶段。由于它处于持续发展中,随着我们努力使其达到最佳状态,您将看到API会不断演变和日趋成熟。 DOTS包含以下元素: 实体组件系统(ECS) - 提供使用面向数据的…

selenuim【1】$x(‘xpath’)、WebDriverWait()、try/assert

文章目录 1、执行driver webdriver.Chrome()后很久才打开浏览器2、浏览器多元素定位 $x(‘xpath语法’)3、打开浏览器driver.get("网址")执行了很久才开始定位元素:等待(1)driver.set_page_load_timeout(t)(2&#xff…

亚信安慧AntDB:编织数据丝路,缔造创新篇章

亚信安慧AntDB作为一款具备国产化升级改造经验的数据库系统,在15年的平稳运行中积累了丰富经验。通过持续的创新和技术进步,AntDB不断优化性能和功能,满足用户的需求,与国际先进数据库系统保持竞争力。 AntDB秉承着与用户和行业保…

2024年最新《国际预警期刊》正式更新!

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、国际期刊预警名单的变化?二、课程案例展示(篇幅有限仅展示部分)1.【热图系列】2.【九象限图系列】3.【富集分析系列】4.【机…

c# 调用ip2region组件 根据ip地址进行定位归属地运营商

需求描述:当项目中需要将IP转换成对应的归属地以及运营商,那么通过ip2region组件即可完美实现。 p2region本身支持net4.5以上,还有个ip2region.net组件,它要求net6及以上。所以,根据自己项目的需求即可选择其中一种方…

Domain Adaptation Vs. Prompt-Tuning:能否用域自适应解决大模型提示学习问题?

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 作者简介 李江梦,中国科学院软件研究所天基综合信息系统全国重点实验室助理研究员 论文简介 今天介绍的是被机器学习领域顶级学术会议ICLR 2024接收的论文:BayesPrompt: Prompting Large…

006-CSS-常见问题汇总

常见问题汇总 1、伪元素与伪类2、偏门但好用的样式3、文字溢出三个点展示4、空白折叠问题5、文字的垂直居中6、 Vue项目中 在父组件中修改子组件样式7、BFC 概念7.1、兄弟元素外边距合并7.2、父子元素外边距塌陷 8、box-sizing8.1、box-sizing: border-box8.2、box-sizing: con…

机器人顶刊IJRR近期国人新作(2024)

一、IJRR简介 The International Journal of Robotics Research(IJRR)是机器人领域的高水平学术期刊,专注于发布关于机器人技术和相关领域的最新研究成果。IJRR创刊于1982年,是该领域的第一本学术刊物,2022-2023最新影…

el-dialog封装组件

父页面 <template><div><el-button type"primary" click"visible true">展示弹窗</el-button><!-- 弹窗组件 --><PlayVideo v-if"visible" :visible.syncvisible /></div> </template><sc…

[Redis]——Spring整合Redis(SpringDataRedis)

⭐准备工作&#xff1a; 确保Redis服务已启动idea开发环境 ⭐Redis整合步骤&#xff1a; 1.pom文件引入依赖 2.yml文件配置连接信息 3.修改Redis序列化方式 4.注入RedisTemplate 使用 小知识&#xff1a; Spring整合的Redis可以将Object对象自动序列化成字符串&#xff0…

探索API测试的奇妙世界:总结与思考!

本文主要是关于 API 测试的方法论探讨。 什么是 API 测试&#xff1f; API 测试是一种软件测试&#xff0c;涉及验证和确认应用程序接口 ( API ) 及其与其他服务组件的交互。测试重点关注软件架构的业务逻辑层&#xff0c;确保API按预期运行、数据准确交换、服务在各种条件下…

在 Centos 7 上编译 OpenJDK 23 及错误处理

在 Centos 7 上编译 OpenJDK 23 目的 希望在 JDK 源码中添加自己的中文注释&#xff0c;方便对学习过程进行记录。 其中遇到的错误主要有BootJDK的版本问题和字符编码问题&#xff0c;没有去调查哪些版本是兼容的&#xff0c;本文主要处理字符编码问题。 操作环境 组件版本…