前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >稳定性三十六计-超时处理

稳定性三十六计-超时处理

作者头像
静儿
发布2019-06-05 16:47:30
9190
发布2019-06-05 16:47:30
举报
文章被收录于专栏:编程一生编程一生

引子

分布式系统调用的三态

在传统的单机系统中,调用一个函数,要么返回成功,要么返回失败。这就是两态系统(2-state system)。

在分布式系统中,由于系统是分布在不同机器上的。还可能有一种状态叫:超时。成功、失败和超时是分布式系统调用的三态。

为什么要超时处理

对于超时这种状态,长时间等待会影响用户体验,并发量大时还可能会因为线程池耗尽而不能响应其他请求。如果这个服务的调用方也是一个服务,那就有可能产生级联反应,导致其他服务不可用,最终产生雪崩效应。

超时处理的手段

超时处理的两个要点:判断什么时候超时和超时后怎么处理。

判断什么时候超时在无基础数据时可通过经验估算一个相对合理值。在服务上线后可依赖统计进行设置,比如设置99%的请求响应时间为超时时间。还可以通过人工智能进行调参来设置。

超时后一般采用快速失败,如果不是核心服务,可直接超时返回失败。如果是核心服务,可以设置相应的重试次数。

HTTP请求超时处理

HTTP请求一般会对两个阶段做超时处理:建立连接阶段、数据通信阶段。在apache的HttpClient实现中,添加了获取连接池阶段。

获取连接池阶段

因为建立连接需要IO、网络带宽等开销,需要池化处理,如果超过了连接池的最大值,则需要等待其他连接执行完释放资源。超时时间一般设置为1s之内。

建立建立阶段

HTTP请求需要“三次握手”,第一次握手客户端发送一个报文到服务器表示想和服务端建立连接。第二次握手是服务端接收到客户端的请求,返回带有同步和相应标记的客户端报文,询问客户端是否准备好。第三次握手是客户端再次响应服务端表示已经准备好。超时时间一般设置为1s到5s。

数据通信阶段

与目标url建立连接后,等待数据报文传输的时间。这个阶段又叫做socket通信阶段。这个阶段可能有两种类型的事件:读取和写入。超时时间一般设1s到5s。

在以上三个阶段的任何一个阶段发生超时则立即终止等待返回失败,http请求一般会设置超时后有三次重试。为了进一步理解,可以借助HttpClient的调用代码来感受一下其使用

    HttpParams httpParams = new BasicHttpParams();

    // 获取连接的最大等待时间1s,对应获取连接池阶段

    ConnManagerParams.setTimeout(httpParams, 1000);

    // 连接超时时间5s,对应建立建立阶段

    HttpConnectionParams.setConnectionTimeout(httpParams, 5000);

    // socket超时时间5s,对应数据通信阶段

    HttpConnectionParams.setSoTimeout(httpParams, 5000);

最近因为OkHttpClient比HttpClient更简单易用,使用的人多起来。借助OkHttpClient的调用代码来感受一下其使用

    OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();

    // 连接超时时间5s,对应建立建立阶段

    httpClientBuilder.connectTimeout(config.getConnectionTimeout(), TimeUnit.MILLISECONDS);

    // 读取超时时间5s,对应数据通信阶段(将socket细分为读取和写入两种类型)

    httpClientBuilder.readTimeout(config.getReadTimeout(), TimeUnit.MILLISECONDS);

    // 写入超时时间5s,对应数据通信阶段(将socket细分为读取和写入两种类型)

    httpClientBuilder.writeTimeout(config.getReadTimeout(), TimeUnit.MILLISECONDS);

读取和写入都是socket阶段的一个证据是如果发生超时,曝出的异常是SocketTimeoutException

Mysql连接超时处理

客户端和Mysql连接也分为建立连接和数据通信两个阶段。目前mysql常用的版本是5.6和5.7。

和超时处理相关的参数汇总如下

参数名称

参数说明

缺省值

最低版本要求

connectTimeout

和数据库服务器简历socket连接时的超时 单位:毫秒。0表示永不超时

0

3.0.1

socketTimeout

socket操作(读写)超时 单位:毫秒。0表示永不超时

0

3.0.1

autoReconnect

当数据库连接异常中断时是否自动重连

false

1.1

maxReconnects

autoReconnect=true时,重试连接的次数

3

1.1

failOverReadOnly

自动重连成功后,连接是否设置为只读

true

3.0.12

autoReconnectForPools

是否使用针对数据库连接池的重连策略

False

3.1.3

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-06-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库专家服务
数据库专家服务(Database Expert Service,DBexpert)为您提供专业化的数据库服务。仅需提交您的具体问题和需求,即可获得腾讯云数据库专家的专业支持,助您解决各类专业化问题。腾讯云数据库专家服务团队均有10年以上的 DBA 经验,拥有亿级用户产品的数据库管理经验,以及丰富的服务经验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档