8张架构图告诉你应该如何优雅设置RPC超时重试

6,076 阅读5分钟

目录

  • 业务系统架构图
  • 微服务项目技术难点1:RPC的超时机制
  • 微服务项目技术难点2:RPC的重试机制
  • 生产项目中timeout和retry一般设置成多少呢?

今天给大家分享一知识点,是关于我们平时开发系统做RPC通信时经常会设置超时和重试两个参数,关于这两个参数如果设置不得当的话,很可能会将我们的系统搞垮。可能很多人都不知道这里面的问题,所以今天给大家好好讲讲。

业务系统架构图

首先,我们还是先引出一个话题,那就是平时我们开发的系统是什么样的?其实往简单了说,就是用spring boot+ssm开发一套业务代码,然后用nacos+dubbo去RPC调用别的系统,这个架构图非常简单,如下所示。 image.png

微服务项目技术难点1:RPC的超时机制

那么在两个系统进行RPC调用的时候,有两个参数其实是至关重要的,一个是timeout超时时间,一个是retry重试次数,这个timeout超时通常用于什么场景呢?大家可以想象一个场景,如果说我们不设置timeout超时时间,是否可能出现这样一种情况,就是你调用的那个系统可能故障了,或者是挂了,或者是它的性能突然很慢很慢,导致你调用它好几秒都没法返回,如下图。 image.png 如果你调用一个系统时间很久都没法返回,此时会导致什么问题?我们要知道,你自己这个系统对外接收请求靠的是线程,假设我们是 通过spring boot内嵌tomcat对外接收请求的,那么其实tomcat就会开很多线程,每个http请求过来了,每个请求都是要交给一个线程来处理的,如下图所示。 image.png 那么一个线程拿到了一个请求开始处理之后,它就会去调用别的系统。如果在调用别的系统这个过程中因为被调用系统故障而导致调用时间超长,好几秒都没个响应,这个时候会怎么样呢?

那还不简单,这会导致tomcat一个线程一直阻塞好几秒都没法去处理别的请求。那么这个时候,如果所有线程都因为调用一个服务被阻塞住了,是不是就导致新的请求过来没有一个线程可以处理了?如下图。 image.png 所以说,往往来说,我们对于别的服务RPC调用一般都得设置一个超时时间,比如说,设置timeout=1s,那么意思就是说,我们调用别的系统如果超过1s没有响应,就直接抛个异常就返回了,这样就可以避免我们的tomcat线程 长时间阻塞了,如下图。 image.png

微服务项目技术难点2:RPC的重试机制

那么除了这个timeout超时时间以外,还有另外一个参数是retry。这个retry的意思是说如果RPC调用一个服务要是失败了,此时就可以通过retry设置自动做一个重试,比如说可以自动重试2次。那么这个时候如果是因为网络偶然抖动导致的调用失败,就可以通过重试2次让它能够成功完成调用了,如下图。 image.png

生产项目中timeout和retry一般设置成多少呢?

好了,现在timeout和retry两个参数讲完了,下面就可以讲这两个参数设置不当是如何导致系统出现故障的了。

先来说这个timeout。这个timeout设置一定要慎重,因为如果它设置的不谨慎可能导致你的系统莫名其妙就直接跨掉了。

比如说,这个timeout你要是设置的时间太长了,好比说5s,10s,那么可能在极端情况下,比如对方系统故障了,你每个请求都要5s、10s才能返回,那不就会导致刚才上面说的问题了?就是tomcat每个线程都得阻塞5s、10s才能返回,这就导致你的系统没法处理新的请求了,如下图。 image.png 那么如果要是timeout设置的太短了呢?比如说设置timeout=500ms,那好,这可能也有很大问题了,因为有可能某一天因为搞活动流量比较大,你调用的系统因为压力比较大,导致它的cpu负载很高,平时一般请求都是300ms~400ms可以返回,结果今天搞成500ms~600ms了,刚好超过了timeout时间,此时就会导致,你大量的请求即将处理完毕要返回的时候,结果一到500ms就超时异常抛出,一到500ms就超时异常抛出,如下图。 image.png 所以说,timeout超时参数设置,通常是这么设置的,对于你要调用的系统你要看看它平时调用要多久能返回,然后比正常的耗时设置的多个50%就可以了,比如平时一般正常在100~200ms,偶尔高峰会在500ms,那你设置个timeout=800ms或者1s其实都可以。

然后就是retry这个参数,这个参数也是不能胡乱设置的,尤其是对于一些调用别的系统写入数据的接口,如果你要是对别的服务的写接口设置了retry,就可能有这样一种场景,某一次写入接口可能耗时稍微长了一些,导致了超时出错,结果你又retry再次重试写入,就可能导致数据会有重复的问题,所以说通常都建议retry参数对读接口可以设置一下,但是对写接口最好是不要设置。

好了,今天关于RPC超时和重试参数的分享就到这里了。

END

扫码 免费获取 600+页石杉老师原创精品文章汇总PDF img 原创技术文章汇总 img