最近项目对接了App和钉钉,项目中有两个后台,Java后台和Python后台,
调用流程:
当App和钉钉接入使用该流程时,遇到一些问题:
App和钉钉在超过指定时间后无法正常获取结果。
其中,App超过2秒,无法获取结果;钉钉超过5秒后无法获取结果,
记录下一下场景以及解决方案,方便后续复盘以及帮助有需要的同学。
同步请求: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后台的结果。
先分析下原因:Java使用的SpringBoot框架:WebFlux,其中,使用WebClient调用外部接口,
WebFlux内部在使用WebClient调用接口时,当监测到调用方与SpringBoot的连接断开后,会自动断开WebClient调用的外部接口,
我还没有找源码,猜想是这样的逻辑,这样可以保护SpringBoot内部的稳定,当主动调用方断开连接后,自身也会断开与外部接口的连接,保证自身的稳定。
因此,出现上述问题后,我们及时调整了方案,使用异步调用的方式,即:App/钉钉向Java后台发起请求后,Java后台直接响应,
然后,Java后台与Python后台进行交互,将最终的结果主动推送给App/钉钉,示意图如下所示。
(1)系统内一个流程内出现多次接口调用时,可以采用异步推送/回调的方式完成;
(2)App/钉钉系统有各自的读取超时时间,当处理时间超过读取超时后,App/钉钉均无法获取结果,可采用异步推送/回调的方式进行消息传递;
(3)后台框架为保证自身稳定性,当调用方断开连接后,后台框架同时会自动断开与外部其他接口的交互。