本文目錄一覽:
Golang中的限速器 time/rate
在高並發的系統中,限流已作為必不可少的功能,而常見的限流演算法有:計數器、滑動窗口、令牌桶、漏斗(漏桶)。其中滑動窗口演算法、令牌桶和漏斗演算法應用最為廣泛。
這裡不再對計數器演算法和滑動窗口作介紹了,有興趣的同學可以參考其它相關文章。
非常很好理解,就像有一個漏斗容器一樣,漏鬥上面一直往容器里倒水(請求),漏斗下方以 固定速率 一直流出(消費)。如果漏斗容器滿的情況下,再倒入的水就會溢出,此時表示新的請求將被丟棄。可以看到這種演算法在應對大的突發流量時,會造成部分請求棄用丟失。
可以看出漏斗演算法能強行限制數據的傳輸速率。
令牌桶演算法
從某種意義上來說,令牌演算法是對漏斗演算法的一種改進。對於很多應用場景來說,除了要求能夠限制數據的平均傳輸速率外,還要求允許某種程度的突發情況。這時候漏桶演算法可能就不合適了,令牌桶演算法更為適合。
令牌桶演算法是指一個固定大小的桶,可以存放的令牌的最大個數也是固定的。此演算法以一種 固定速率 不斷的往桶中存放令牌,而每次請求調用前必須先從桶中獲取令牌才可以。否則進行拒絕或等待,直到獲取到有效令牌為止。如果桶內的令牌數量已達到桶的最大允許上限的話,則丟棄令牌。
Golang標準庫中的限制演算法是基於令牌桶演算法(Token Bucket) 實現的,庫名為golang.org/x/time/rate
對於限流器的消費方式有三種,分別為 Allow()、 Wait()和 Reserve()。前兩種內部調用的都是Reserve() ,每個都對應一個XXXN()的方法。如Allow()是AllowN(t, 1)的簡寫方式。
主要用來限速控制並發事件,採用令牌池演算法實現。
使用 NewLimiter(r Limit, b int) 函數創建限速器,令牌桶容量為b。初始化狀態下桶是滿的,即桶里裝有b 個令牌,以後再以每秒往裡面填充 r 個令牌。
允許聲明容量為0的限速器,此時將會拒絕所有操作。
// As a special case, if r == Inf (the infinite rate), b is ignored.
有一種特殊情況,就是 r == Inf 時,此時b參數將被忽略。
Limiter 提供了三個主要函數 Allow, Reserve, 和 Wait. 大部分時候使用Wait。其中 AllowN, ReserveN 和 WaitN 允許消費n個令牌。
每個方法都可以消費一個令牌,當沒有可用令牌時,三個方法的處理方式不一樣
AllowN方法表示,截止在某一時刻,目前桶中數目是否至少為n個。如果條件滿足,則從桶中消費n個token,同時返回true。反之不消費Token,返回false。
使用場景:一般用在如果請求速率過快,直接拒絕請求的情況
輸出
當使用Wait方法消費Token時,如果此時桶內Token數量不足(小於N),那麼Wait方法將會阻塞一段時間,直至Token滿足條件。否則直接返回。
// 可以看到Wait方法有一個context參數。我們可以設置context的Deadline或者Timeout,來決定此次Wait的最長時間。
輸出
// 此方法有一點複雜,它返回的是一個*Reservation類型,後續操作主要針對的全是這個類型
// 判斷限制器是否能夠在指定時間提供指定N個請求令牌。
// 如果Reservation.OK()為true,則表示需要等待一段時間才可以提供,其中Reservation.Delay()返回需要的延時時間。
// 如果Reservation.OK()為false,則Delay返回InfDuration, 此時不想等待的話,可以調用 Cancel()取消此次操作並歸還使用的token
輸出
limit的所有用法是什麼?
1.set a limit to:為xx設置一個限制/極限
2.the limit of:xx的極限
3.without limit:沒有限制,無極限
4.limit sth to:將某物限制在xx範圍內
例如:1.她知道自己的許可權 She knows her limit.
2.我為了減肥,限定自己每天攝入1000卡的熱量
In order to lose weight, I limit my daily intake of calories to 1000. n. 限度;限制;界線 vt. 限制;限定 limit [‘limit] n. 1. 界限,界線,限度,極限,極點 2. [複數] 範圍;境界;領土 3. (漁、獵等的)限額;限量;限度 4. (一次下的)賭注限額 5. [the limit] [口語]使人惱怒或高興到極點的人(或事);叫人無法忍受的人(或事) 6. 【數學】 (數列的)極限 (函數的)極限 (定積分的)極限 vt. 1. 限制;限定(在一定範圍內): 例句: The teacher limited her to 800 words for her composition.
老師將她的作文限定在800字以內。 Class membership is limited to 20.
班級人數限定在20名以內。 2. 減少;削減: 例句: We should limit the expenses.
我們應該節省開支。 3. 【法律】確定;確切指派: 例句: to limit an estate over to someone
將一份產業判定給某人 近義詞: bound . restrict . 反義詞: widen . expand . 短語 1. be the limit[口語]太過分,叫人無法忍受;使人無法可想 [參見 That’s the limit.] 2. go beyond (或 over) the limit過分;超過限度 3. go the limit
a. [美國英語] b. 【體育】(球賽或拳擊賽等)打全場,賽完全局,打到規定的回數 c. 達到極限;達到最後階段;壞到無以復加的地步 d. 開始性交 4. have (或 know) (no) limits有(沒有)限度 5. off limits[美國英語] (尤指軍人)禁止入內;禁區 6. reach the limit of one’s resources山窮水盡 7. set a limit to對…加以限制;控制 8. That’s the limit.[口語]這實在太過分了。簡直令人忍無可忍。不能再忍了。 9. there is a limit (或 are limits) to…是有限的 10. to the (utmost) limit[美國英語]到極點,到了最大限度 11. within (one’s) limits在一定範圍內;適度地,有限度地 12. without limit無限地;無限制地
Go 限制同時執行的線程數
假設,現在有1w個任務,需要通過線程並發執行。如果直接執行,會把內存撐爆。需要讓這些任務一批一批執行。如果設定,每次最多同時執行10個任務。
需要用到通道channel,利用channel的limit,通過堵塞通道的方式,把進程堵住。
原創文章,作者:EYWG,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/143409.html