内容简介:引子分布式系统调用的三态在传统的单机系统中,调用一个函数,要么返回成功,要么返回失败。这就是两态系统(2-state system)。
引子
分布式系统调用的三态
在传统的单机系统中,调用一个函数,要么返回成功,要么返回失败。这就是两态系统(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 |
总结
慢就是错
以上所述就是小编给大家介绍的《稳定性三十六计-超时处理》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
RESTful Web Services Cookbook
Subbu Allamaraju / Yahoo Press / 2010-3-11 / USD 39.99
While the REST design philosophy has captured the imagination of web and enterprise developers alike, using this approach to develop real web services is no picnic. This cookbook includes more than 10......一起来看看 《RESTful Web Services Cookbook》 这本书的介绍吧!