spingboot开发的应用作为客户端,可以是相互调用的,但是相互调用会出现个问题就是交叉调用,
如图举例,A处理一个业务需要调用F的服务,但是F处理这个有需要B的服务,B处理有需要E的服务,E有需要A的服务,这样循环会导致个问题大家都都是相互调用,条例清除的话基本还不会死循环调用。
而且测试的时候基本也没啥问题,单元测试时都是规规矩矩的基本测不出来,而且单机压力测试基本很难压出来因为,A这里已经瓶颈限制了,一上线压力一大就会出问题。
举例A-F每个应用每秒能够处理100个请求,A首先由100个请求来了,E也收到100个请求,E这100个还要去请求A,A已经没有多余的能力来处理请求,最后死循环系统卡死,调用超时。
我们当时第一次用springcloud的时候项目上线就出现这个问题,一到高峰时段系统就卡起,重启系统就好一会,平时没有出现,一到高峰期就出问题。
查询服务器连接数据
netstat -an | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}',显示等待连接数超多。后面才想到可能是springcloud客户端阻塞。
怎么拆呢,不允许交叉调用,只能单向调,A只能调B,B不能调A,如果B非要调A,A单独一个项目出来改成A-1专门给B调用,这样处理后面基本就是好了。
以前我们做项目的时候,也是云服务,当初有一个规定就是只能单向调用服务。
今天在一个微信公众号也看到了也有人问这个问题!