内容简介:引子分布式系统调用的三态在传统的单机系统中,调用一个函数,要么返回成功,要么返回失败。这就是两态系统(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 |
总结
慢就是错
以上所述就是小编给大家介绍的《稳定性三十六计-超时处理》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
PHP高级程序设计
Kevin McArthur / 汪泳 等 / 人民邮电出版社出版 / 2009.7 / 45.00元
今天,PHP已经是无可争议的Web开发主流语言。PHP 5以后,它的面向对象特性也足以与Java和C#相抗衡。然而,讲述PHP高级特性的资料一直缺乏,大大影响了PHP语言的深入应用。 本书填补了这一空白。它专门针对有一定经验的PHP程序员,详细讲解了对他们最为重要的主题:高级面向对象、设计模式、文档、测试和标准PHP库等内容。同时,为适应目前Web开发的新趋势,作者还全面探讨了MVC架构和Z......一起来看看 《PHP高级程序设计》 这本书的介绍吧!