Rails 在 Rails 中,通过 API 与其他系统交互,第三方 API 不稳定的情况的处理办法

Zoker · 2014年09月04日 · 最后由 badboy 回复于 2014年09月04日 · 1833 次阅读

如果第三方的api不稳定,比如偶尔的一次服务中断,导致请求都没有请求到数据,而且接口又比较多,请问这种情况,该怎么处理接口失效的办法?

共收到 6 条回复

我猜只能遇到失败进行回滚,还要对前面的API的效果进行补偿。

这个要看实际情况了,比如该API有没有写入数据的操作,API失效是不是由超额访问引起。根据实际情况可以考虑建立一个本地的API proxy。

这样做有几个好处

  • Proxy 的缓存机制可以自行设计和管理,有效减少与外界的交互流量。由于很多第三方API都是有用量限制的,所以这一层往往是必须的
  • 可以有效降低客户端对第三方API接口的依赖,不需要根据第三方接口频繁修改客户端。也使得对第三方API的选择更为灵活,同时使用多个厂商的。
  • 如果是写入数据的操作,当API失效时,可以暂存在proxy内,恢复后再重新尝试操作。

gem "retries"

用 Ruby 异常捕捉,捕捉到超时或其他的异常,用 retry 重试。

Faraday 为例:

retry_count = 0
begin
  retry_count += 1
  res = Faraday.get("http://www.google.com")
rescue Faraday::TimeoutError
  retry if retry_count <= 2
end

我的建议是 1、建立缓存机制,如果有些api是可以缓存的,就存起来,不用重复取,失效再获取 2、尽量用异步,因为你提到了很多个接口,不是1、2个接口,失败了重新再试。你10个接口,9个成功了,1个失败了,不能再把前面9个重新来一次吧。接口多了,就需要等待。。。异步处理多接口,用户可以不需要必须等响应。只需要对整体进度达到100%,告诉用户成功了即可。 3、做一些接口的连接状态的判断。这个不一定存在,但我碰到过,多个服务器地址提供接口,但是我需要获得较快的接口,供系统使用。。。

大致应该还有一些方式。

再问下,你是不是跑大疆去面试啦。。。这问题他们老问,我的答案估计他们也不认。。。嘿嘿

之前对接微信某些API时,也是不稳定,也是使用了 retry 的方法,不过在 rescue中添加了 sleep 1,请求API失败,又马上再请求,或许再成功的机会也不高,sleep,命中率很高。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册