调用接口超时处理
调用接口超时处理
待完善…
1.增加超时时间|增加接口的超时时间
假设A系统有个方法methodA,会调用B系统的methodB这个http接口,如果mehodA不追求超快的响应速度,那么你在调用methodB这个http接口时,可以增长超时时间,例如10秒超时。因为经常在某些时刻,由于网络原因或者系统原因,调用method会超时的。
2.尝试多调用一次|超时重试,从概率角度去进行估算超时异常的概率
需要考虑超时时间的设置,请求超时的概率来设置重试的次数,不一定是重试一次,可以是多次.
如果第一次调用methodB超时了,那么你可以尝试多调用一次。当然前提是,methodA不追求超快的响应时间。注意:调用多次不代表重复调用 制造脏数据;
但是这种方案的前提时间也是以调用方能够接收到的最长时间为前提,就是所有调用次数的时间加起来不能超过这个大前提;
3.使用待处理队列|延迟队列
如果methodA需要很快的响应速度,那么当调用methodB接口超时时,可以使用一个队列存储本次失败的记录,然后使用一个job每隔一段时间去扫这个队列,看看是否有待处理的数据。
备注:如果对方系统挂掉了,使用待处理队列的方式,比较合适。
这个只适合返回的结果不依赖超时的这个环节,否则该方案行不通.
4.回滚数据
catch这个超时异常,然后记录日志后,抛出这个异常,并把之前的数据回滚。让对方的系统重新调用。
备注:宁愿没有数据,也不要存储脏数据。
5.使用异步机制|异步线程池
如果你的业务方法中,需要调用对方的http接口,如果这个http接口不影响主流程的,那么可以使用一个线程,异步调用对方的http接口,并把超时时间设置长一些。由于使用了异步,主流程会立刻继续走的。
将耗时的请求使用异步线程单独的去执行,并将结果单独的存放在一个结果表中,然后在需要的地方去查询耗时线程的执行结果.如果这个耗时请求在业务上是串行的,可以让主业务线程在需要耗时线程结果的地方去查询结果表,然后进行主业务,这样就是在主业务一开始就执行异步线程,然后想尽量利用在调用异步线程结果之前的这段代码的执行时间,在这一段时间并行执行,这样可以减少主线程的等待时间.
但是这种改造的成本比较大,相当于新增一个单独的耗时任务的接口,上游业务方调用也会多一层.
todo…