spring cloud feign 调用服务脱钩(异步)处理

最近两天在一堆冗余代码里面抽出短信和email模块做单独服务,遇到一个感觉比较有意思的问题。下面给大家罗列一下基本西信息

1.环境 win10  i5-3230M RAM12G mysql远程数据库

2.技术采用spring cloud feign 负载 hystrix做熔断处理

3.暂时无接入MQ做解耦

一、原先技术架构是一步到位。结构如下图:spring cloud feign 调用服务脱钩(异步)处理_第1张图片

上图可以看出用户一个请求的TTL时间为800ms

spring cloud feign 调用服务脱钩(异步)处理_第2张图片

然后我实测了一下 500个请求   
预计执行时间 :400ms + 400ms * 500 = 200400ms

实际执行时间:(203554ms-400ms)/501次 = 405.497006ms 

上面结果可以看出实际结果和执行结果几乎差不多,并没有什么出入的地方。

结论:一共执行了501次请求TTL 时间 203秒,三分二十三秒,QPS2.5。

二、下面我做了脱钩,技术结构如下:

spring cloud feign 调用服务脱钩(异步)处理_第3张图片

上图可以看出用户一个请求的TTL时间为406ms

spring cloud feign 调用服务脱钩(异步)处理_第4张图片

 

 

 

然后我实测了一下 500个请求   
预计执行时间 :400ms + 6ms * 500 = 3400ms

实际执行时间:(3351ms-400ms)/500次 = 5.902ms 

上面结果也可以看出实际结果和执行结果几乎差不多

结论:一共执行了500次请求TTL 时间 3.35秒,三分二十三秒,QPS149.2,相对而已对比第一次执行时间从203秒压缩到3秒多一点点 这效率的提升达到将近67倍效率的提升,如果只从第一个结构来看可以想象以后如果我们后面在挂其他服务,TTL耗时只会成倍数叠加。这是一件很可怕的事情。
 

三、有意思的地方
      因为我们还没有用MQ,所以我只能利用异步来做脱钩的处理,可是我在spring 官网没看到feign有异步支持的任何信息,只能从自己想想办法或者网上找找资料

方案一:
            设置hystrix 超时时间为10000ms ,自动熔断发出的请求已达到异步脱钩的操作,缺点不够优雅,是个很暴力的解决方案,而且你要保证在设置的超时范围内,调用着的请求能否被接收方收到(感觉这点很不靠谱)。

方案二(未完善):

           利用rxjava 进行扩展(前提是提供对外api(Single、Completable) ),看了一下,确实是可行的,当然是在前提的情况下,坐等大佬完善。

方案三:

           利用注解@Async,直接放在被调用者的方法上,也可以利用返回参数FutureTask来做一些回调从处理,总的来很已经达到目的的要求了。
           PS:其实一开始我想放在feign上面的,在调用者那里做脱钩处理,结果方法不可行,小伙伴们可以试试。如果可以 麻烦下面留言告诉我一声,3Q.

 

            

      

 

 

你可能感兴趣的:(springCloud)