考虑如下情况:A服务调用B服务的RPC接口。需要等待B服务的接口返回后,才能继续执行后面的操作。即或者B服务的接口正常返回,或者B服务的接口超时或异常返回。一定要等到一个确定的结果后,A服务的逻辑才能继续往下走。
这种情况下,使用同步调用和异步调用,似乎没有太大的区别。因为无论A同步调用还是异步调用B,都需要等待B的执行结果返回。对于调用A服务,而等待A服务结果的客户端,他都需要等待大致相同的时间。
当B服务出现较多的超时时,A因为同步调用,而会出现处理队列的阻塞,整个服务的平均处理时间会加长。但换成异步调用,整个A服务的平均回包时间还是会加长,因为必须将对B调用的超时时间均摊到A的完整响应时间内。
如果有以下模型:
1 B(1)
3 2 1 A =>
2 B(2)
A端有一个处理队列,B端有两个处理队列。此时来三个请求:1,2,3。如果请求1调B时,B(1)正常处理,但未处理完。此时请求2被分到B(2),出了异常不返回了。
此时如果是同步调用,则A的第3请求不能被处理,只能在2后面等。如果2超时时间为10t,总的处理时间是10t+t