1.4 限流算法
時(shí)間:2022-03-05 00:50:01 | 來(lái)源:行業(yè)動(dòng)態(tài)
時(shí)間:2022-03-05 00:50:01 來(lái)源:行業(yè)動(dòng)態(tài)
在上面的功能概覽中簡(jiǎn)單的說(shuō)明了在某些場(chǎng)景中我們需要進(jìn)行流量限制,那么這里將詳細(xì)介紹限流的原理。
在OSS中,我們使用Guava的RateLimiter作為限流的組件。Guava的RateLimiter的限流方式有兩種:漏桶算法和令牌桶算法。我們采用的是令牌桶算法。
對(duì)于很多應(yīng)用場(chǎng)景來(lái)說(shuō),除了要求能夠限制數(shù)據(jù)的平均傳輸速率外,還要求允許某種程度的突發(fā)傳輸。這時(shí)候漏桶算法可能就不合適了,令牌桶算法更為適合。如圖所示,令牌桶算法的原理是系統(tǒng)會(huì)以一個(gè)恒定的速度往桶里放入令牌,而如果請(qǐng)求需要被處理,則需要先從桶里獲取一個(gè)令牌,當(dāng)桶里沒有令牌可取時(shí),則拒絕服務(wù)。
我們的OSS就是采用令牌桶的方式來(lái)對(duì)流量進(jìn)行限制的,當(dāng)客戶端以某一穩(wěn)定的速率來(lái)向OSS寫入的時(shí)候,系統(tǒng)是穩(wěn)定的并且大多數(shù)的時(shí)候是這樣的。但是我們有時(shí)需要應(yīng)對(duì)流量峰值,這個(gè)時(shí)候超過(guò)我們規(guī)定的流量就會(huì)被限制。現(xiàn)在問(wèn)題來(lái)了,被限制的流量如果直接丟棄,那么可能重要的文件被丟棄,這樣顯然不符合我們對(duì)OSS定位為高可用存儲(chǔ)系統(tǒng)的要求。于是在限流的邏輯中我們加入了以下處理流程:當(dāng)流量達(dá)到系統(tǒng)的瓶頸時(shí),我們將被限流的流量寫入kafka,等到系統(tǒng)負(fù)載降低的時(shí)候,再?gòu)膋afka中讀取這部分流量重放至OSS,這樣既保證了OSS的穩(wěn)定性,又解決因限流帶來(lái)的數(shù)據(jù)丟失問(wèn)題。