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