【网络协议】聊聊网络ReadTimeout和ConnectTimeout

在实际的开发中,网络超时是一个比较常见的问题,比如说针对支付系统,超时就需要进行和三方人员进行核对订单状态,是否人工介入处理。
但其实在设计网络框架的时候,一般都有两个超时参数
连接超时参数 ConnectTimeout,让用户配置建连阶段的最长等待时间;
读取超时参数 ReadTimeout,用来控制从 Socket 上读取数据的最长等待时间。

一般来说连接超时,除非是网络不通,否则的话 TCP三次握手都是很快就可以建立连接的。所以对于连接超时时间一般配置比较短。

1.对于读取超时,认为服务端的处理会中断

@RestController
@RequestMapping("/clientreadtimeout")
@Slf4j
public class HttpController {private String getResponse(String url, int connectTimeout, int readTimeout) throws IOException {return Request.Get("http://localhost:8088/clientreadtimeout" + url).connectTimeout(connectTimeout) //连接时间1S.socketTimeout(readTimeout)//读取时间2S.execute().returnContent().asString();}@GetMapping("/client")public String client() throws IOException {log.info("client1 called");//服务端5s超时,客户端读取超时2秒return getResponse("/server?timeout=20000", 1000, 15000);}@GetMapping("/server")public void server(@RequestParam("timeout") int timeout) throws InterruptedException {log.info("server called");TimeUnit.MILLISECONDS.sleep(timeout);log.info("Done");}
}

在这里插入图片描述
2023-12-02 16:39:20.405 INFO 51914 — [nio-8088-exec-2] c.q.spingboot.controller.HttpController : Done

在code中,设置了15S的读取超时时间,1S的连接时间,但是整个方法的执行sleep了20S,虽然调用超时了,但是方法还是正确执行完毕了。所以不能轻易的下结论认为超时就一定执行失败了,可能只是服务端处理任务比较久,超过了设置了最大socket读取时间。

2.第二个误区,以为读取超时只是socket层面的概念
通常连接超时大多是网络不通或者服务不在线。而读取超时是服务处理超时,客户端向socket写入数据后,等待服务端写入数据给socket。也即是服务端处理业务逻辑的时间。
在这里插入图片描述
3.合理参考实际业务情况 设置超时时间
一般来说,如果下游服务处理过久,我们可以设置一个合理的超时时间,比如平均处理20S,那么久可以设置30S。通过HTTP请求获取结果都是同步调用,所以如果超时时间设置太久,就可能出现超时等待,当有大流量请求进来,那么就会出现大量线程的等待,最终拖垮服务。

所以建议是,对于定时任务或者异步任务,读取超时配置可以配置长一点,但是对于面向客户或者有大流量接口的同步接口,并发量比较大,所以不推荐设置太长的超时时间。一般建议是30S。

设置时间太短,比如2S,但是实际下游处理3S,那么就永远获取不到结果。所以设置一个合理的中位数是需要结合具体的业务场景考虑。

小结

超时一般对应的重试机制,但是需要下游有幂等。所以在对接一些上下游服务的时候,需要考虑多种异常情况,而不能只完成需求层面的东西,不关注技术点上的异常设计。

【弹力设计篇】聊聊API设计中的幂等性
【弹力设计篇】聊聊重试机制

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

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

相关文章

目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】缺陷检测

目录 几个高频面试题目 深度学习工具在缺陷检测中是如何工作的? 深度学习是如何工作的? 深度学习缺陷检测技术

vue项目node-sass^4.14.1 python gyp 报错解决办法

npm i node-sass4.14.1 --sass_binary_sitehttps://npm.taobao.org/mirrors/node-sass/参考链接:链接

LabVIEW在不同操作系统上使VI、可执行文件或安装程序

LabVIEW在不同操作系统上使VI、可执行文件或安装程序 LabVIEW可以在多个操作系统上运行,主要支持以下几种操作系统: Windows: LabVIEW在各个版本的Windows操作系统上都能运行,包括Windows 7、Windows 8和Windows10。LabVIEW为Wi…

elk:filebeat也是一个日志收集工具

filebeat是一个轻量级的日志收集工具,所使用的系统资源比logstash部署和启动使用的资源要小的多 filebeat可以允许在非java环境,他可以代替logstash在非java环境上收集日志 filebeat无法实现数据的过滤,一般是结合logstash的数据过滤功能一…

Safe and Practical GPU Computation in TrustZone论文阅读笔记

Safe and Practical GPU Computation in TrustZone 背景知识: youtube GR视频讲解链接:ASPLOS’22 - Session 2A - GPUReplay: A 50-KB GPU Stack for Client ML - YouTube GPU软件栈: 概念:"GPU软件栈"指的是与GPU硬件…

openssl生成ssl证书

x509证书一般会用到三类文,key,csr,crt。 Key 是私用密钥openssl格,通常是rsa算法。 Csr 是证书请求文件,用于申请证书。在制作csr文件的时,必须使用自己的私钥来签署申,还可以设定一个密钥。…

使用mybatis-plus框架:@Autowired报错Could not autowire. No beans of ‘XXX‘ type found

使用mybatis-plus框架,使用xxmapper报错: 解决办法是:在mapper中添加注解: Repository Mapper 也可以使用 AutowiredSysRoleMenuService sysRoleMenuService;替代 AutowiredSysRoleMenuMapper sysRoleMenuMapper;方法名不同,但…

处理和分析人类语言数据-NLTK安装和使用

简介:NLTK(Natural Language Toolkit)是一个强大的Python库,用于处理和分析人类语言数据,是一个开源的项目,包含:Python模块,数据集和教程,用于NLP的研究和开发&#xff…

Windows系统下Elasticsearch-7.15.2安装

一、环境 此次笔记使用的运行环境以及软件版本 系统:WIN10 JDK版本:1.8 Elasticsearch版本:7.15.2 elasticsearch-head版本:最新 IK分词器版本:7.15.2 Kibana版本:7.15.2 二、Elasticsearch基本知识 2.1 介绍…

java源码-类与对象

1、类与对象的初步认知 在了解类和对象之前我们先了解一下什么是面向过程和面向对象。 1)面向过程编程: C语言就是面向过程编程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 2)面向对…

【已解决】ModuleNotFoundError: No module named ‘PIL‘

问题描述 Traceback (most recent call last): File "train.py", line 75, in <module> import PILModuleNotFoundError: No module named PIL 解决办法 pip install pillow

第一类瑞利索末菲标量衍射模型的方孔衍射的空间像计算(附python计算代码)

记第一类瑞利索末菲标量衍射模型的方孔衍射的空间像计算(附python计算代码) RS type 1 衍射空间像计算傅里叶变换采样条件实际计算计算要求傅立叶变换法计算直接卷积方法计算代码傅立叶变换方法直接卷积https://zhuanlan.zhihu.com/p/624292239 Goodman, J. W. (2004). Intro…

rman SBT_TAPE NFS disk 模拟NBU带库 FRA

-----------------rman 将本地磁盘变成磁带----------------------------------- ##RAC 本地 /nfs----两个备份策略 clustern run { allocate channel ch00 device type SBT_TAPE PARMS"SBT_LIBRARYoracle.disksbt, ENV(BACKUP_DIR/nfs)"; backup recove…

蓝桥杯day04——查询后矩阵的和

1.题目 给你一个整数 n 和一个下标从 0 开始的 二维数组 queries &#xff0c;其中 queries[i] [typei, indexi, vali] 。 一开始&#xff0c;给你一个下标从 0 开始的 n x n 矩阵&#xff0c;所有元素均为 0 。每一个查询&#xff0c;你需要执行以下操作之一&#xff1a; …

已知二叉树采用顺序存储,求编号为i和j的结点的最近公共祖先结点编号。

题目描述&#xff1a;已知二叉树采用顺序存储&#xff0c;求编号为 i和j的结点的最近公共祖先结点编号。 分析&#xff1a; 令两个下标从两个初始点开始&#xff0c;你追我赶的交替向上&#xff0c;直到在某地相遇。即先令较大的下标&#xff08;对应位置较低的点&#xff09;…

C++作业2

自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show() 代码&#xff1a…

数字图像处理(实践篇)十七 Shi-Tomasi 角点检测

目录 一 涉及的函数 二 实践 在使用OpenCV之前&#xff0c;需要先安装相关的库和依赖项&#xff0c;命令如下所示&#xff1a; # 安装OpenCV的基础版pip install opencv-python# 安装OpenCV的扩展版pip install opencv-contrib-python 一 涉及的函数 OpenCV 提供了cv2.goo…

gitee仓库使用教程

目录 一、项目与仓库映射 二、git常用命令的用法 一、项目与仓库映射 下载安装git&#xff1b;在本地项目文件夹右击鼠标点击Git Bash Here;输入git init&#xff0c;这个目录变成git可以管理的仓库&#xff0c;会出现一个.git文件夹&#xff0c;如果没出现的话需要选择“显…

DAPP开发【02】Remix使用

系列文章目录 系列文章在DAPP开发专栏 文章目录 系列文章目录使用部署测试网上本地项目连接remix本地项目连接remix 使用 创建一个新的工作空间 部署测试网上 利用metaMask连接测试网络 添加成功&#xff0c;添加时需要签名 即可进行编译 即可部署 本地项目连接remix 方…

探秘RabbitMQ:社区插件与扩展的奇妙世界【RabbitMQ 三】

&#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 探秘RabbitMQ&#xff1a;社区插件与扩展的奇妙世界 前言第一&#xff1a;RabbitMQ社区插件简介第二&#xff1a;高级队列插件特性实现延迟队列 - rabbitmq_delayed_message_…