每個系統(tǒng)都有服務的上線,所以當流量超過服務極限能力時,系統(tǒng)可能會出現(xiàn)卡死、崩潰的情況,所以就有了降級和限流。限流其實就是:當高并發(fā)或者瞬時高并發(fā)時,為了保證系統(tǒng)的穩(wěn)定性、可用性,系統(tǒng)以犧牲部分請求為代價或者延遲處理請求為代價,保證系統(tǒng)整體服務可用
方案一:令牌桶方式(Token Bucket)
令牌桶算法是網(wǎng)絡流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一種算法。先有一個木桶,系統(tǒng)按照固定速度,往桶里加入Token,如果桶已經滿了就不再添加。當有請求到來時,會各自拿走一個Token,取到Token 才能繼續(xù)進行請求處理,沒有Token 就拒絕服務。
這里如果一段時間沒有請求時,桶內就會積累一些Token,下次一旦有突發(fā)流量,只要Token足夠,也能一次處理,所以令牌桶算法的特點是允許突發(fā)流量。
方案二:漏桶方式
水(請求)先進入到漏桶里,漏桶以一定的速度出水(接口有響應速率),當水流入速度過大會直接溢出(訪問頻率超過接口響應速率),然后就拒絕請求,可以看出漏桶算法能強行限制數(shù)據(jù)的傳輸速率。
可見這里有兩個變量,一個是桶的大小,支持流量突發(fā)增多時可以存多少的水(burst),另一個是水桶漏洞的大小(rate)。
因為漏桶的漏出速率是固定的參數(shù),所以,即使網(wǎng)絡中不存在資源沖突(沒有發(fā)生擁塞),漏桶算法也不能使流突發(fā)(burst)到端口速率.因此,漏桶算法對于存在突發(fā)特性的流量來說缺乏效率。
令牌桶和漏桶對比
1.令牌桶是按照固定速率往桶中添加令牌,請求是否被處理需要看桶中令牌是否足夠,當令牌數(shù)減為零時則拒絕新的請求;
2.漏桶則是按照常量固定速率流出請求,流入請求速率任意,當流入的請求數(shù)累積到漏桶容量時,則新流入的請求被拒絕;
3.令牌桶限制的是平均流入速率(允許突發(fā)請求,只要有令牌就可以處理,支持一次拿3個令牌,4個令牌),并允許一定程度突發(fā)流量;
4.漏桶限制的是常量流出速率(即流出速率是一個固定常量值,比如都是1的速率流出,而不能一次是1,下次又是2),從而平滑突發(fā)流入速率;
5.令牌桶允許一定程度的突發(fā),而漏桶主要目的是平滑流入速率;
6.兩個算法實現(xiàn)可以一樣,但是方向是相反的,對于相同的參數(shù)得到的限流效果是一樣的。
方案三:計數(shù)器方式
計數(shù)器限流算法也是比較常用的,主要用來限制總并發(fā)數(shù),比如數(shù)據(jù)庫連接池大小、線程池大小、程序訪問并發(fā)數(shù)等都是使用計數(shù)器算法。也是最簡單粗暴的算法。
如若轉載,請注明出處:開源字節(jié) https://sourcebyte.cn/article/232.html