springcloud中Ribbon常常用來做負(fù)載均衡忙厌,其超時(shí)時(shí)間可以用以下公式來計(jì)算铃岔。
RibbonTime=(ReadTimeout+ConnectTimeout)*(1+MaxAutoRetries)*(1+MaxAutoRetriesNextServer)
ReadTimeout:處理超時(shí)時(shí)間
ConnectTimeout:連接建立超時(shí)時(shí)間
MaxAutoRetries:當(dāng)前服務(wù)器的重試次數(shù)(不包括當(dāng)前請求)
MaxAutoRetriesNextServer:負(fù)載到其他服務(wù)器的請求次數(shù)
上圖中T1指網(wǎng)關(guān)轉(zhuǎn)發(fā)請求到服務(wù)A時(shí)涉馁,總共的超時(shí)時(shí)間门岔。
T2指服務(wù)A調(diào)用服務(wù)B的超時(shí)時(shí)間,如果服務(wù)是采用Feign烤送,則代表是FeignClient的超時(shí)時(shí)間寒随。
一、服務(wù)A到服務(wù)B的超時(shí)時(shí)間測試
服務(wù)A中FeignClient的超時(shí)配置如下(其中網(wǎng)關(guān)的超時(shí)時(shí)間是60秒)
#--------------超時(shí)配置----------------------
#hystrix超時(shí)
hystrix.command.default.execution.timeout.enabled=true
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=70000
#開啟重試機(jī)制
spring.cloud.loadbalancer.retry.enabled=true
#當(dāng)前服務(wù)器連接次數(shù)
ribbon.MaxAutoRetries=2
#下個(gè)負(fù)載均衡服務(wù)器連接次數(shù)
ribbon.MaxAutoRetriesNextServer=1
#請求處理的超時(shí)時(shí)間
ribbon.ReadTimeout=14000
#請求連接超時(shí)時(shí)間
ribbon.ConnectTimeout=10000
#--------------超時(shí)配置----------------------
執(zhí)行超時(shí):14秒,連接超時(shí):10秒妻往,熔斷:150秒互艾,本服務(wù)器重試次數(shù):2次,下個(gè)服務(wù)器重試次數(shù):1次蒲讯,假如服務(wù)B執(zhí)行需要200秒忘朝,
Feign是get接口,實(shí)際需要84秒超時(shí)
Feign是post接口判帮,實(shí)際需要14秒超時(shí)
由此可以看出得出如下結(jié)論
結(jié)論一:get請求時(shí)會重試局嘁。post請求不會重試,主要是考慮到冪等性問題晦墙。當(dāng)然可以通過配置強(qiáng)制所有接口都重試(不推薦)
由實(shí)際測試結(jié)果看悦昵,實(shí)際的超時(shí)時(shí)間并沒有包括配置的連接超時(shí)時(shí)間,這一點(diǎn)跟官網(wǎng)給出的超時(shí)時(shí)間的計(jì)算是有出入的晌畅,原因未知但指。
get:T2 = 14*(1+2)*(1+1) = 84秒
post:T2 = 14*1*1 = 14秒
如果把熔斷超時(shí)修改為70秒,其他配置不變
則實(shí)際超時(shí)時(shí)間如下
get:min(14*(1+2)*(1+1), 70)=70
Post: min(14*1*1, 70)=14
結(jié)論二:熔斷的超時(shí)時(shí)間要大于執(zhí)行超時(shí)
這是在服務(wù)A中看到的時(shí)間結(jié)果抗楔,但是由于zuul配置的超時(shí)時(shí)間是60秒棋凳,所以返回給用戶的信息是60秒就已經(jīng)超時(shí)。
二连躏、網(wǎng)關(guān)的超時(shí)時(shí)間測試
FeignClient的超時(shí)時(shí)間不變剩岳,網(wǎng)關(guān)的超時(shí)配置如下:
#--------------超時(shí)配置----------------------
#hystrix超時(shí)
hystrix.command.default.execution.timeout.enabled=true
zuul.ribbonIsolationStrategy=THREAD
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=90000
#開啟重試機(jī)制
zuul.retryable=true
#當(dāng)前服務(wù)器連接次數(shù)
ribbon.MaxAutoRetries=1
#下個(gè)負(fù)載均衡服務(wù)器連接次數(shù)
ribbon.MaxAutoRetriesNextServer=1
#請求處理的超時(shí)時(shí)間
ribbon.ReadTimeout=15000
#請求連接超時(shí)時(shí)間
ribbon.ConnectTimeout=10000
#--------------超時(shí)配置----------------------
實(shí)際超時(shí)時(shí)間:
Get請求時(shí): T1 = 15*(1+1)*(1+1) = 60秒
Post請求時(shí): T1 = 15秒
如果把熔斷的超時(shí)時(shí)間改為40秒,其他不變
#--------------超時(shí)配置----------------------
#hystrix超時(shí)
hystrix.command.default.execution.timeout.enabled=true
zuul.ribbonIsolationStrategy=THREAD
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=40000
#開啟重試機(jī)制
zuul.retryable=true
#當(dāng)前服務(wù)器連接次數(shù)
ribbon.MaxAutoRetries=1
#下個(gè)負(fù)載均衡服務(wù)器連接次數(shù)
ribbon.MaxAutoRetriesNextServer=1
#請求處理的超時(shí)時(shí)間
ribbon.ReadTimeout=15000
#請求連接超時(shí)時(shí)間
ribbon.ConnectTimeout=10000
#--------------超時(shí)配置----------------------
Get請求時(shí): T1 = min(40, 15*(1+1)*(1+1)) = 40秒
Post請求時(shí): T1 = min(40, 15) = 15秒