wordpress 建站免费,湛江网站建设方案托管,网络规划设计师教程第2版2021版pdf,营销型网站建设公司地址在实际的开发中#xff0c;网络超时是一个比较常见的问题#xff0c;比如说针对支付系统#xff0c;超时就需要进行和三方人员进行核对订单状态#xff0c;是否人工介入处理。 但其实在设计网络框架的时候#xff0c;一般都有两个超时参数 连接超时参数 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?timeout20000, 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设计中的幂等性 【弹力设计篇】聊聊重试机制