大白話講講限流、漏桶和令牌桶

限流

所謂限流,核心點是限制流出,而不是流入。

怎麼理解這句話?

比如去醫院看病,如果人非常多的話,很大概率在進去之前,一羣人就被攔在大門外排隊,那扇門就是限流器。

每個時間段來看病的人數是不可控制的,因此限流器的流入是不可控制的,能做的是控制每段時間通過這個門的人數,也就是真正進入醫院的人數。

漏桶和令牌桶

限流有幾個常用的算法,比如漏桶和令牌桶。

漏桶就是從排隊的人裏面,每經過一段時間固定放進去幾個人。

令牌桶就是每次進去之前,都要領一個號(令牌),拿到號才能進去,每段時間固定發放幾個號。

當然這裏我們假設排的隊可以無限長,實際上不管是漏桶還是令牌桶,都是有大小的,漏桶裏裝的是請求,滿了就拒絕服務了,令牌桶裏裝的是令牌,滿了令牌只能溢出。

流量突增的場景

這兩者之間雖然大體上功能一致,細節上還是有一些微妙的差異。比如令牌桶可以支持一定程度上的流量突增。

如果某個時間段人來的少比如6點,剛纔講號可以堆積,但不能無限堆積,超過一定量就廢棄了。

如果堆積了一定的號,下一波人多的時候,比如8點,就可以多一點人一起進去。

而漏桶實際上並不具備這樣的能力。

併發和時延

既然前面講了限流,那最後再扯幾句關於系統容量很關鍵的衡量指標:併發和時延。

大部分時候我們的說想設計一個支持高併發、低時延的系統。好像這倆概念永遠是一起出現的。實際上,它們是從兩個維度在看問題。

還是以醫院爲例,當只有一個醫生坐診的時候,系統能支持的併發數是1。

假設看病平均會花10分鐘,那麼時延就是10分鐘。也就是一個請求發過去,rt(response time)是10分鐘。

用併發數除以時延,那整個醫院的每分鐘能處理0.1個病人。這個就是系統所謂的吞吐量。

如果說要把吞吐量提高一倍,可以有2個辦法:再增加一個醫生,原來的大家排成一隊變成兩隊一起處理。從這個角度來說,併發增加了,但是時延是不變的。

或者說通過各種先進的設備,把平均一個人看病的時間縮短到5分鐘。從這個角度來說,時延變短了,併發不變。

當然,這裏用的比喻,2個醫生之間各看各的病,互相沒什麼影響,也就是說如果把醫生數提高到10個,吞吐量就水平擴了10倍。這是比較理想的情況。

而再實際的秒殺場景下,由於可能會共享一些資源(比如數據庫)使得系統無法做到完全的水平擴容。

沒想到原來想順帶提一下的點比正文更長了,希望講清楚了關於秒殺的一些基本概念。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章