介绍
- 请求超时,客户端给服务端发送请求时超时,此时服务端没有收到客户端的请求;
- 服务端内部超时,服务端可能存在DB操作、IO操作、调用其他服务超时;
- 响应超时,服务端给客户端返回响应时超时,此时服务端已经处理了请求。
超时发生需要客户端和服务端如何处理呢?
客户端最常见方法:
- 重试(前提是服务端接口支持幂等),重试间隔梯度增大,重试次数阈值最大值
- 不重试直接去查询请求结果状态,根据结果确认是否请求成功,或者什么都不处理,直接认为失败不做进一步处理
- 具体接口场景具体对待
服务端:
- 服务端内部如果超时了,应该尽快给客户端返回,告诉客户端超时失败,这个主要是通过服务端内部超时控制来实现,例如:golang http.TimeoutHandler
幂等性
支持接口无限重试主要靠的就是幂等性,实现幂等一般采用流水号机制,相同请求使用同一流水号,流水号的生成要保证全局唯一,有一些算法可以实现,比如snowflake算法,接口处理过的请求流水号需要把流水号存储起来,后续相同流水号请求直接返回已处理,一般将流水号直接放到redis中存储,同时,这种幂等性判断,可以从接口移动到网关中,由网关统一处理,接口开发不需要关注幂等性处理,就像service mesh一样,将通用的一些处理下沉到网关统一处理
引用
有疑问加站长微信联系(非本文作者)