婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Golang 限流器的使用和實現(xiàn)示例

Golang 限流器的使用和實現(xiàn)示例

熱門標簽:賺地圖標注的錢犯法嗎 濮陽自動外呼系統(tǒng)代理 廣東語音外呼系統(tǒng)供應商 地圖標注測試 智能電銷機器人營銷 烏魯木齊人工電銷機器人系統(tǒng) 福州鐵通自動外呼系統(tǒng) 澳門防封電銷卡 長沙ai機器人電銷

限流器是服務中非常重要的一個組件,在網(wǎng)關(guān)設計、微服務、以及普通的后臺應用中都比較常見。它可以限制訪問服務的頻次和速率,防止服務過載,被刷爆。

限流器的算法比較多,常見的比如令牌桶算法、漏斗算法、信號量等。本文主要介紹基于漏斗算法的一個限流器的實現(xiàn)。文本也提供了其他幾種開源的實現(xiàn)方法。

基于令牌桶的限流器實現(xiàn)

在golang 的官方擴展包 time 中(github/go/time),提供了一個基于令牌桶算法的限流器的實現(xiàn)。

原理

令牌桶限流器,有兩個概念:

  • 令牌:每次都需要拿到令牌后,才可以訪問
  • 桶:有一定大小的桶,桶中最多可以放一定數(shù)量的令牌
  • 放入頻率:按照一定的頻率向通里面放入令牌,但是令牌數(shù)量不能超過桶的容量

因此,一個令牌桶的限流器,可以限制一個時間間隔內(nèi),最多可以承載桶容量的訪問頻次。下面我們看看官方的實現(xiàn)。

實現(xiàn)

限流器的定義

下面是對一個限流器的定義:

type Limiter struct {
 limit Limit // 放入桶的頻率  (Limit 為 float64類型)
 burst int  // 桶的大小

 mu   sync.Mutex
 tokens float64 // 當前桶內(nèi)剩余令牌個數(shù)
 last time.Time // 最近取走token的時間
 lastEvent time.Time // 最近限流事件的時間
}

其中,核心參數(shù)是 limit,burst。 burst 代表了桶的大小,從實際意義上來講,可以理解為服務可以承載的并發(fā)量大小;limit 代表了 放入桶的頻率,可以理解為正常情況下,1s內(nèi)我們的服務可以處理的請求個數(shù)。

在令牌發(fā)放后,會被保留在Reservation 對象中,定義如下:

type Reservation struct {
 ok    bool // 是否滿足條件分配到了tokens
 lim    *Limiter // 發(fā)送令牌的限流器
 tokens  int  // tokens 的數(shù)量
 timeToAct time.Time // 滿足令牌發(fā)放的時間
 limit Limit // 令牌發(fā)放速度
}

Reservation 對象,描述了一個在達到 timeToAct 時間后,可以獲取到的令牌的數(shù)量tokens。 (因為有些需求會做預留的功能,所以timeToAct 并不一定就是當前的時間。

限流器如何限流

官方提供的限流器有阻塞等待式的,也有直接判斷方式的,還有提供了自己維護預留式的,但核心的實現(xiàn)都是下面的reserveN 方法。

// 在 now 時間需要拿到n個令牌,最多可以等待的時間為maxFutureResrve
// 結(jié)果將返回一個預留令牌的對象
func (lim *Limiter) reserveN(now time.Time, n int, maxFutureReserve time.Duration) Reservation {
 lim.mu.Lock()

 // 首先判斷是否放入頻次是否為無窮大,如果為無窮大,說明暫時不限流
 if lim.limit == Inf {
  // ...
 }

 // 拿到截至now 時間時,可以獲取的令牌tokens數(shù)量,上一次拿走令牌的時間last
 now, last, tokens := lim.advance(now)

 // 然后更新 tokens 的數(shù)量,把需要拿走的去掉
 tokens -= float64(n)

 // 如果tokens 為負數(shù),說明需要等待,計算等待的時間
 var waitDuration time.Duration
 if tokens  0 {
  waitDuration = lim.limit.durationFromTokens(-tokens)
 }

 // 計算是否滿足分配條件
 // ① 需要分配的大小不超過桶容量
 // ② 等待時間不超過設定的等待時常
 ok := n = lim.burst  waitDuration = maxFutureReserve

 // 最后構(gòu)造一個Reservation對象
 r := Reservation{
  ok:  ok,
  lim:  lim,
  limit: lim.limit,
 }
 if ok {
  r.tokens = n
  r.timeToAct = now.Add(waitDuration)
 }

 // 并更新當前l(fā)imiter 的值
 if ok {
  lim.last = now
  lim.tokens = tokens
  lim.lastEvent = r.timeToAct
 } else {
  lim.last = last
 }

 lim.mu.Unlock()
 return r
}

從實現(xiàn)上看,limiter 并不是每隔一段時間更新當前桶中令牌的數(shù)量,而是記錄了上次訪問時間和當前桶中令牌的數(shù)量。當再次訪問時,通過上次訪問時間計算出當前桶中的令牌的數(shù)量,決定是否可以發(fā)放令牌。

使用

下面我們通過一個簡單的例子,學習上面介紹的限流器的使用。

 limiter := rate.NewLimiter(rate.Every(100*time.Millisecond), 10)
 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
  if limiter.Allow() {// do something
   log.Println("say hello")
  }
 })
 _ = http.ListenAndServe(":13100", nil)

上面,每100 ms 放入令牌桶中1個令牌,所以當批量訪問該接口時,可以看到如下結(jié)果:

2020/06/26 14:34:16 say hello  有18 條記錄
2020/06/26 14:34:17 say hello  有10 條記錄
2020/06/26 14:34:18 say hello  有10 條記錄
  ...

一開始漏斗滿著,可以緩解部分突發(fā)的流量。當漏斗未空時,訪問的頻次和令牌放入的頻次變?yōu)橐恢隆?/p>

其他限流器的實現(xiàn)

uber 開源庫中基于漏斗算法實現(xiàn)了一個限流器。漏斗算法可以限制流量的請求速度,并起到削峰填谷的作用。 https://github.com/uber-go/ratelimit

滴滴開源實現(xiàn)了一個對http請求的限流器中間件。可以基于以下模式限流。

  • 基于IP,路徑,方法,header,授權(quán)用戶等限流
  • 通過自定義方法限流
  • 還支持基于 http header 設置限流數(shù)據(jù)
  • 實現(xiàn)方式是基于 github/go/time 實現(xiàn)的,不同類別的數(shù)據(jù)都存儲在一個帶超時時間的數(shù)據(jù)池中。
  • 代碼地址 https://github.com/didip/tollbooth

golang 網(wǎng)絡包中還有基于信號量實現(xiàn)的限流器。 https://github.com/golang/net/blob/master/netutil/listen.go 也值得我們?nèi)W習下。

總結(jié)

令牌桶實現(xiàn)的限流器算法,相較于漏斗算法可以在一定程度上允許突發(fā)的流量進入我們的應用中,所以在web應用中最為廣泛。

在實際使用時,一般不會做全局的限流,而是針對某些特征去做精細化的限流。例如:通過header、x-forward-for 等限制爬蟲的訪問,通過對 ip,session 等用戶信息限制單個用戶的訪問等。

到此這篇關(guān)于Golang 限流器的使用和實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Golang 限流器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • golang簡易令牌桶算法實現(xiàn)代碼
  • 詳解Golang實現(xiàn)請求限流的幾種辦法
  • golang高并發(fā)限流操作 ping / telnet
  • golang接口IP限流,IP黑名單,IP白名單的實例
  • Golang實現(xiàn)請求限流的幾種辦法(小結(jié))
  • Golang模擬令牌桶進行對訪問的限流方式

標簽:貴陽 慶陽 調(diào)研邀請 阿克蘇 太原 廣西 西雙版納 德州

巨人網(wǎng)絡通訊聲明:本文標題《Golang 限流器的使用和實現(xiàn)示例》,本文關(guān)鍵詞  Golang,限流,器,的,使用,和,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Golang 限流器的使用和實現(xiàn)示例》相關(guān)的同類信息!
  • 本頁收集關(guān)于Golang 限流器的使用和實現(xiàn)示例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    久久蜜桃一区二区| 欧美另类videos死尸| 久色婷婷小香蕉久久| 日韩精品欧美精品| 男男gaygay亚洲| 蜜臀av性久久久久av蜜臀妖精| 日韩av中文字幕一区二区 | 亚洲bt欧美bt精品| 视频一区视频二区中文字幕| 青青草97国产精品免费观看 | 91免费观看视频在线| 欧美综合一区二区| 日韩欧美亚洲一区二区| 久久久亚洲精品一区二区三区| 国产日产欧美一区二区三区| 国产精品麻豆欧美日韩ww| ...av二区三区久久精品| 亚洲黄色性网站| 美腿丝袜在线亚洲一区| 精品午夜久久福利影院| av午夜精品一区二区三区| 欧美日韩色综合| 精品免费国产一区二区三区四区| 欧美韩日一区二区三区四区| 亚洲美女精品一区| 麻豆精品蜜桃视频网站| av一区二区不卡| 欧美一区二区成人6969| 国产精品美女久久久久aⅴ| 亚洲自拍另类综合| 激情久久五月天| 91蝌蚪国产九色| 亚洲精品一区二区三区99| 亚洲精品欧美二区三区中文字幕| 老司机精品视频在线| 91丨porny丨国产| 欧美大片拔萝卜| 亚洲精品高清在线观看| 韩国中文字幕2020精品| 91精品办公室少妇高潮对白| 久久天天做天天爱综合色| 亚洲一区二区在线播放相泽 | 欧美一区二区视频在线观看| 中文字幕乱码一区二区免费| 日本一区中文字幕| 欧美在线免费观看视频| 中文字幕乱码久久午夜不卡| 久久精品国产亚洲a| 欧美日韩一区二区三区在线| 中文字幕在线一区免费| 精品中文字幕一区二区| 欧美日韩精品电影| 亚洲精品中文在线| 99久久久精品| 国产精品国产自产拍高清av | 色综合久久综合中文综合网| 欧美精品一区二区三区很污很色的 | 国产精品一区二区你懂的| 欧美片网站yy| 亚洲色大成网站www久久九九| 国产成人精品午夜视频免费| 日韩欧美成人一区二区| 欧美a一区二区| 欧美一区二区视频观看视频| 亚洲欧美国产毛片在线| 成人免费电影视频| 国产精品素人视频| 99国产欧美另类久久久精品| 中文字幕中文字幕一区| 99久久精品国产一区| 国产精品久久久久影院老司 | 国产ts人妖一区二区| 精品国产百合女同互慰| 久久99精品视频| 国产日本欧洲亚洲| 国产精品亚洲午夜一区二区三区| 337p粉嫩大胆噜噜噜噜噜91av | 欧美午夜寂寞影院| 亚洲特黄一级片| 99re热这里只有精品免费视频| 国产精品麻豆一区二区| 成人免费毛片片v| 亚洲视频综合在线| 欧美午夜精品一区二区三区| 亚洲高清免费在线| 日韩免费看的电影| 国产99久久久国产精品免费看| 国产欧美日韩三级| 91丝袜高跟美女视频| 图片区小说区国产精品视频| 欧美大度的电影原声| 成人国产精品免费观看视频| 一区二区三区在线视频观看58| 3d动漫精品啪啪1区2区免费 | 成人精品高清在线| 亚洲精品中文在线影院| 69精品人人人人| 成人网男人的天堂| 亚洲国产aⅴ成人精品无吗| 欧美成人艳星乳罩| 91在线无精精品入口| 日韩黄色免费电影| 国产精品欧美一区二区三区| 欧美美女一区二区三区| 国产成人福利片| 人人精品人人爱| 国产精品无人区| 欧美人与禽zozo性伦| 国产成人aaaa| 精品一区二区免费看| 亚洲视频一区二区在线观看| 日韩欧美一区二区免费| 色综合久久久久| 国产另类ts人妖一区二区| 亚洲国产日韩在线一区模特| 久久婷婷久久一区二区三区| 欧美视频完全免费看| 成人伦理片在线| 国产中文字幕一区| 日韩精品每日更新| 成人免费在线播放视频| 国产亚洲一区二区三区| 91精品国产色综合久久不卡蜜臀| av在线一区二区| 成人三级伦理片| 国产一区免费电影| 久久精品国产99国产| 亚洲3atv精品一区二区三区| 亚洲欧美日韩在线| 国产精品国产三级国产普通话99 | 17c精品麻豆一区二区免费| 2023国产精品| 欧美一级片免费看| 欧美日韩五月天| 在线免费一区三区| 色综合天天天天做夜夜夜夜做| 成人在线一区二区三区| 国产传媒欧美日韩成人| 精品一区二区三区蜜桃| 日韩国产欧美一区二区三区| 亚洲国产一区视频| 亚洲国产精品久久艾草纯爱 | 亚洲欧洲日产国码二区| 欧美国产禁国产网站cc| 久久免费偷拍视频| 精品福利一二区| 国产亚洲欧洲997久久综合| 久久久久亚洲综合| 欧美精品一区在线观看| 久久久久久久电影| 中文字幕一区二区三区在线观看 | 国产福利视频一区二区三区| 国产剧情在线观看一区二区| 国产一区二区三区香蕉| 国产成人亚洲综合a∨婷婷图片| 激情成人午夜视频| 国产大陆a不卡| 色婷婷国产精品久久包臀| 欧美日韩精品电影| 精品久久免费看| 国产精品久久久久久久久久久免费看 | 一区二区三区在线高清| 午夜精品一区二区三区电影天堂| 午夜精品爽啪视频| 久久电影网站中文字幕| 国产不卡在线一区| 色婷婷亚洲婷婷| 日韩欧美在线网站| 亚洲国产精品成人久久综合一区| 最新成人av在线| 日韩国产欧美视频| 成人综合婷婷国产精品久久免费| 日本电影欧美片| 久久一区二区三区四区| 亚洲综合色成人| 国产综合色视频| 欧美色中文字幕| 国产婷婷色一区二区三区| 一区二区三区产品免费精品久久75| 青草国产精品久久久久久| 成人av电影免费在线播放| 欧美男女性生活在线直播观看| 久久嫩草精品久久久精品| 亚洲伦理在线精品| 精品午夜久久福利影院| 99热99精品| 精品国产91久久久久久久妲己 | 欧美无砖砖区免费| 欧美岛国在线观看| 亚洲精品国产成人久久av盗摄| 精品一区二区久久| 欧美精品日韩精品| 亚洲欧美偷拍另类a∨色屁股| 韩国午夜理伦三级不卡影院| 欧美日本免费一区二区三区| 国产精品嫩草久久久久| 极品销魂美女一区二区三区| 91国偷自产一区二区开放时间| 国产清纯在线一区二区www| 天堂成人免费av电影一区|