慧揚(yáng)健康基于業(yè)務(wù)等級(jí)的限流設(shè)計(jì)
背景
在慧揚(yáng)健康醫(yī)療信息化項(xiàng)目建設(shè)中,為了避免在高并發(fā)的情況下因為請(qǐng)求量過大造成的業(yè)務(wù)處理系統(tǒng)資源耗盡導(dǎo)致業(yè)務(wù)中斷的問題,在設(shè)計(jì)階段,慧揚(yáng)健康在核心業(yè)務(wù)處理模塊中增加限流機(jī)制。
技術(shù)架構(gòu)
在業(yè)務(wù)流程中,后端采用的3層架構(gòu),分別用于處理不同的業(yè)務(wù):
如上,不同的業(yè)務(wù)放在不同的服務(wù)器上,以N+1的方式實(shí)現(xiàn)負(fù)載均衡。但是對(duì)于單個(gè)應(yīng)用來說,資源是固定的,因此希望通過限流來限制同時(shí)進(jìn)行的業(yè)務(wù)處理請(qǐng)求數(shù)量。考慮到每個(gè)業(yè)務(wù)請(qǐng)求所耗費(fèi)的資源巨大,慧揚(yáng)健康希望能精確控制不同業(yè)務(wù)的并發(fā)量。同時(shí),因?yàn)椴煌臉I(yè)務(wù)優(yōu)先級(jí)不一樣,我們需要讓系統(tǒng)在資源不夠的情況下能優(yōu)先保證高優(yōu)先級(jí)任務(wù)的請(qǐng)求能被執(zhí)行。基于以上需求,參考了下當(dāng)前主流的限流方式后,我們以類似于令牌桶的方法設(shè)計(jì)了下列的一個(gè)限流模式:
1、不同的業(yè)務(wù)類型有單獨(dú)的令牌桶,每個(gè)業(yè)務(wù)桶里的令牌數(shù)不一樣。對(duì)于一些資源開銷小,處理速度快,請(qǐng)求量比較大的業(yè)務(wù)類型,給予更多的令牌數(shù);而對(duì)于資源開銷大,處理速度慢,請(qǐng)求量比較小的業(yè)務(wù),令牌數(shù)響應(yīng)地減少。
如上,不同顏色代表不同的請(qǐng)求類型,通過能否獲取對(duì)應(yīng)的令牌來決定是否能發(fā)送該業(yè)務(wù)請(qǐng)求到業(yè)務(wù)處理系統(tǒng)。
2、令牌數(shù)在應(yīng)用初始化時(shí)生成,不采用刷新機(jī)制,而是在每次需要發(fā)送業(yè)務(wù)請(qǐng)求到業(yè)務(wù)系統(tǒng)時(shí)從該類型的業(yè)務(wù)令牌桶中獲取令牌,獲取到則該令牌桶令牌數(shù)減1,而后當(dāng)接受到該請(qǐng)求的第一條響應(yīng)消息或者請(qǐng)求錯(cuò)誤時(shí)將令牌放回令牌桶,通過這樣的方式來保證令牌數(shù)的總數(shù)。
3、考慮到業(yè)務(wù)類型不一樣,優(yōu)先級(jí)不一樣,同時(shí)不同業(yè)務(wù)有不同的令牌桶,為了保證在高并發(fā)場(chǎng)景下高優(yōu)先級(jí)的業(yè)務(wù)能得到有效執(zhí)行,我們?cè)O(shè)置了令牌占用機(jī)制。也就是說,高優(yōu)先級(jí)的令牌數(shù)不夠的時(shí)候,可以占用低優(yōu)先級(jí)的的令牌,從而保證高優(yōu)先級(jí)的任務(wù)能夠被有效執(zhí)行,同時(shí)又能保證整個(gè)業(yè)務(wù)系統(tǒng)同時(shí)處理的業(yè)務(wù)請(qǐng)求不超過一定限制。此外,對(duì)于一些特定的優(yōu)先級(jí)比較高,業(yè)務(wù)比較獨(dú)立的業(yè)務(wù),擁有不可被占用的令牌桶,同時(shí)也不得占用別人的令牌。
綜上,通過這樣的設(shè)計(jì),我們對(duì)業(yè)務(wù)處理的并發(fā)進(jìn)行了限流控制,同時(shí)又根據(jù)優(yōu)先級(jí)設(shè)置了一定的彈性,在系統(tǒng)的能力范圍之類,允許不同的業(yè)務(wù)組合同時(shí)被處理,并優(yōu)先保障了高優(yōu)先級(jí)業(yè)務(wù)的及時(shí)響應(yīng)。
后續(xù)
限流的設(shè)計(jì)完成只是開始,在后續(xù)的測(cè)試中我們發(fā)現(xiàn)更多的問題出在令牌數(shù)的設(shè)置是否合理,負(fù)載均衡是否有效等一系列的原因上。對(duì)于令牌數(shù)的設(shè)置,因?yàn)椴煌脑O(shè)備性能不一樣,業(yè)務(wù)吞吐量也不一樣,因此需要針對(duì)不同的服務(wù)器配置進(jìn)行基于特定的業(yè)務(wù)組合的性能測(cè)試,找到性能較優(yōu)的令牌組合才能在不影響業(yè)務(wù)系統(tǒng)的情況下盡量達(dá)到最優(yōu)的業(yè)務(wù)處理能力。