线上问题:多个Http请求同步调用无法获取结果的解决方案

1 缘起

最近项目对接了App和钉钉,项目中有两个后台,Java后台和Python后台,
调用流程:

前端
Java后台
Python后台

当App和钉钉接入使用该流程时,遇到一些问题:
App和钉钉在超过指定时间后无法正常获取结果。
其中,App超过2秒,无法获取结果;钉钉超过5秒后无法获取结果,
记录下一下场景以及解决方案,方便后续复盘以及帮助有需要的同学。

2 问题复现

同步请求:App/钉钉先请求Java后台,Java后台然后请求Python后台,
Java后台等待Python后台响应结果,前端等待Java后台响应结果,示意如下图所示。

当App/钉钉向Java后台发起请求并建立连接后,App/钉钉在读取超时时间内拿不到响应,自动断开与Java后台的连接。

理论上我们猜想,App/钉钉与Java后台、Python后台建立连接后,无论App/钉钉与Java后台的连接是怎样的,
都不会影响Java后台与Python后台的连接状态,但是,实际上,App/钉钉与Java后台断开连接后,导致Java与Python之间的连接也断开,
最终,App/钉钉无法获取结果,Java也获取不到Python后台的结果。
请添加图片描述

3 解决方案

先分析下原因:Java使用的SpringBoot框架:WebFlux,其中,使用WebClient调用外部接口,
WebFlux内部在使用WebClient调用接口时,当监测到调用方与SpringBoot的连接断开后,会自动断开WebClient调用的外部接口,
我还没有找源码,猜想是这样的逻辑,这样可以保护SpringBoot内部的稳定,当主动调用方断开连接后,自身也会断开与外部接口的连接,保证自身的稳定。

因此,出现上述问题后,我们及时调整了方案,使用异步调用的方式,即:App/钉钉向Java后台发起请求后,Java后台直接响应,
然后,Java后台与Python后台进行交互,将最终的结果主动推送给App/钉钉,示意图如下所示。

请添加图片描述

3 小结

(1)系统内一个流程内出现多次接口调用时,可以采用异步推送/回调的方式完成;
(2)App/钉钉系统有各自的读取超时时间,当处理时间超过读取超时后,App/钉钉均无法获取结果,可采用异步推送/回调的方式进行消息传递;
(3)后台框架为保证自身稳定性,当调用方断开连接后,后台框架同时会自动断开与外部其他接口的交互。

  • 28
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天然玩家

坚持才能做到极致

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值