第三方接口挂掉,最好是不影响我们自身服务的运行,但是我们没有办法控制第三方接口稳定,所以我们需要优化我们的调用架构。

基本情况

我们以跨公网调用其他平台接口为例,很多时候,业务需要跨公网调用一个第三方服务提供的接口,为了避免每个调用方都依赖于第三方服务,往往会抽象一个服务,所以基本调用流程都是

可见基本流程

  • 业务调用方调用内部service
  • 内部service跨公网调用第三方接口
  • 第三方接口返回结果给内部service
  • 内部service返回结果给业务调用方

内部服务可能对上游业务提供了很多服务接口,当有一个接口跨公网第三方调用超时时,可能导致所有接口都不可用,即使大部分接口不依赖于跨公网第三方调用。

而且我们经常会遇到这种情况,内部服务对业务方提供的N个接口,会共用服务容器内的工作线程(假设有100个工作线程)。假设这N个接口的某个接口跨公网依赖于第三方的接口,发生了网络抖动,或者接口超时(不妨设超时时间为5秒)。

解决方案

最常想到的就是,加大调用次数,降低超时时间,或者拆分业务,但是都不能重根本上解决问题。

异步代理法

增加一个代理,向服务屏蔽究竟是“本地实时”还是“异步远程”去获取返回结果

本地实时流程

  • 业务调用方调用内部service
  • 内部service调用异步代理service
  • 异步代理service通过OpenID在本地拿取数据
  • 异步代理service将数据返回内部service
  • 内部service返回结果给业务调用方

异步远程流程

  • 异步代理service定期跨公网调用微信服务
  • 微信服务返回数据
  • 刷新本地数据

这样公网抖动,第三方接口超时,不影响内部接口调用,只会返回的不是最新的数据,很多业务场景都是适用允许的。

第三方接口备份与切换法

同时使用(或者备份)多个第三方服务。这样就可以调用第一个三方接口超时后,调用第二个备份服务,未来都直接调用备份服务,直到超时的服务恢复,这样公网抖动,第三方接口超时,不影响内部接口调用(初期少数几个请求会超时),但是不是所有公网调用都能够像短息网关,电子合同服务一样有备份接口的,像微信、支付宝等就只此一家

异步调用法

本地调用成功就返回成功,异步调用第三方接口同步数据(和异步代理有微小差别),其实就是将数据拉到本地。