1. 背景
调用第三方接口在很多系统中都很常见,不管是调用本公司其他业务平台的接口,还是调用第三方公司的接口,一定要注意系统的容错性,谨记:任何第三方都是不可信的。
常见问题:雪崩
如客户端访问B服务,由于网络原因或者自身的原因,如果B服务不能及时响应,客户端将处于阻塞状态,直到B服务响应。此时若有大量的请求涌入,客户端线程资源会被消耗完毕,导致客户端也瘫痪。造成的级联灾难,这就是服务“雪崩”效应。
2. 最佳实践
2.1. 监控与告警
接口异常要记录,尽可能地保存业务信息,方便还原信息,错误达到阈值要报警
同时需要将接口的响应时间进行监控,针对响应时间慢的接口需要和接口提供方沟通是否有优化空间。
2.2. 超时设置
超时设置主要有两个参数:连接超时(ConnectionTimeout)、读取超时(ReadTimeout)。
需要合理的设置超时参数(通过压测数据确认超时时间),不能无限等待,如果设置超时时间过长,在高并发场景下容易导致线程挂起,CPU负载飙高,超时时间太短容易出现超时异常。
2.3. 异步处理
针对接口响应时间长的接口,可以和接口提供方协商改为异步接口,通过回调通知结果。
2.4. 服务隔离
按照一定的原则划分为若干个外部服务模块,各个模块之间相对独立,无强依赖。当有故障发生时,能将问题和影响隔离在某个模块内部,而不扩散风险,不波及其它模块,不影响整体的系统服务。
2.5. 限流
限流也是为了保障系统的安全性,因为有时业务方因为业务扩展导致调用量激增,容易引起服务端宕机。
请求量超过接口上限时系统可以拒绝请求或排队,以此保证系统的安全性。
先压测给出合理评估量,如TPS(每秒处理的请求量);这样既不会造成系统资源的浪费。
常见的限流规则:
当接口QPS达到某个阈值,则限流
- 快速失败:常规流控方式。当前接口超过设置阈值的流量,直接拒绝多余的请求。
- 预热启动:适用于避免突增流量瞬间冲击系统的场景。请求流量会在预热时间内缓步增加至阈值量级,多余请求会直接拒绝掉。
- 排队等待:适用于流量匀速器场景。触发流控后,多余请求会按照顺序等待,达到等待时长后失败
2.6. 熔断
断路器是一种非常有效的容错机制,可以在应用程序出现故障或异常时快速失败(如果不快速失败,上游服务线程会一直等待响应,占用一个线程),避免上层服务级联崩溃,并且可以在一定的时间窗口内尝试恢复故障组件的访问,从而提高应用程序的可用性和稳定性。
统计某个时间窗口
- 根据慢调用比例%
- 慢调用响应时间RT达到xx毫秒,则进行熔断,熔断xx秒(在该时间段内,该接口的请求都会快速失败。可以返回降级的值)
- 根据异常比例%
- 异常比例达到阈值百分比,则进行熔断,熔断xx秒(在该时间段内,该接口的请求都会快速失败。可以返回降级的值)
2.7. 降级
和熔断相结合,当触发熔断后,直接返回预设好的结果。