亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > Golang 限流器的使用和實現示例

Golang 限流器的使用和實現示例

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

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

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

基于令牌桶的限流器實現

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

原理

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

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

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

實現

限流器的定義

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

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

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

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

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

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

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

限流器如何限流

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

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

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

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

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

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

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

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

 // 并更新當前limiter 的值
 if ok {
  lim.last = now
  lim.tokens = tokens
  lim.lastEvent = r.timeToAct
 } else {
  lim.last = last
 }

 lim.mu.Unlock()
 return r
}

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

使用

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

 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個令牌,所以當批量訪問該接口時,可以看到如下結果:

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 條記錄
  ...

一開始漏斗滿著,可以緩解部分突發的流量。當漏斗未空時,訪問的頻次和令牌放入的頻次變為一致。

其他限流器的實現

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

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

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

golang 網絡包中還有基于信號量實現的限流器。 https://github.com/golang/net/blob/master/netutil/listen.go 也值得我們去學習下。

總結

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

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

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

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

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

巨人網絡通訊聲明:本文標題《Golang 限流器的使用和實現示例》,本文關鍵詞  Golang,限流,器,的,使用,和,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang 限流器的使用和實現示例》相關的同類信息!
  • 本頁收集關于Golang 限流器的使用和實現示例的相關信息資訊供網民參考!
  • 推薦文章
    日韩专区亚洲综合久久| 国产一区二区精品久久91| 精品国产一区二区三区久久久蜜臀| 国产伦理精品| 久久精品免视看国产成人2021| 青青青草视频在线观看| 一级毛片视频播放| 九九干| 黄视频网站免费看| 色综合久久天天综线观看| 日本特黄特色aa大片免费| 日韩在线观看免费完整版视频| 欧美激情一区二区三区视频高清 | 亚洲第一色在线| 天天做日日爱夜夜爽| 黄色福利| 日韩专区在线播放| 成人av在线播放| 日本免费乱理伦片在线观看2018| 精品久久久久久中文| 日韩专区在线播放| 成人免费高清视频| 久久精品店| 九九精品久久| 欧美一区二区三区在线观看| 韩国三级香港三级日本三级| 91麻豆爱豆果冻天美星空| 精品久久久久久中文字幕2017| 久草免费在线观看| 国产成人啪精品| 国产不卡高清在线观看视频| 国产精品自拍一区| 亚洲精品久久久中文字| 日韩一级黄色片| 国产激情一区二区三区| 国产91丝袜在线播放0| 青青久久精品| 亚洲 激情| 日韩一级黄色| 国产精品自拍在线观看| 久久国产影视免费精品| 成人免费高清视频| 精品国产亚洲一区二区三区| 欧美一区二区三区在线观看| 天天做日日爱夜夜爽| 国产成人精品影视| 韩国毛片| 九九久久99综合一区二区| 亚洲女人国产香蕉久久精品| 青青青草视频在线观看| 久久成人亚洲| 国产韩国精品一区二区三区| 久久精品大片| 国产麻豆精品| 国产成人女人在线视频观看| 精品国产一区二区三区久久久蜜臀| 欧美日本免费| 毛片成人永久免费视频| 欧美激情伊人| 韩国三级一区| 国产福利免费视频| 成人免费一级纶理片| 亚洲女人国产香蕉久久精品| 亚洲女人国产香蕉久久精品| 国产91精品系列在线观看| 欧美日本免费| 午夜在线影院| 日韩在线观看网站| 韩国三级视频网站| 超级乱淫伦动漫| 九九免费高清在线观看视频| 国产a毛片| 日韩在线观看网站| a级黄色毛片免费播放视频| 国产成人精品影视| 欧美激情一区二区三区在线播放 | 国产一区二区精品| 国产伦理精品| 欧美激情伊人| 青草国产在线| 欧美另类videosbestsex高清| 欧美a级大片| 亚洲第一色在线| 九九久久国产精品大片| 午夜激情视频在线观看 | 美女免费精品高清毛片在线视 | 成人免费一级纶理片| 九九热国产视频| 亚欧成人乱码一区二区| 国产91丝袜在线播放0| 国产不卡高清在线观看视频| 香蕉视频三级| 亚洲天堂在线播放| 国产不卡高清在线观看视频| 亚洲精品中文字幕久久久久久| 99久久精品国产麻豆| 欧美a级大片| 九九久久国产精品大片| 日日日夜夜操| 韩国毛片免费| 青青久久精品| 精品在线观看国产| 成人影院一区二区三区| 国产一区二区福利久久| 国产91精品系列在线观看| 国产91丝袜在线播放0| 欧美大片一区| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 四虎久久精品国产| 日韩av片免费播放| 天天做日日爱夜夜爽| 国产一区二区精品在线观看| 午夜欧美成人久久久久久| 二级片在线观看| 久久成人亚洲| 国产91精品一区二区| 欧美1区2区3区| 成人影视在线播放| 午夜在线亚洲| 可以免费看毛片的网站| 欧美a级大片| 精品在线观看国产| 久久久久久久男人的天堂| 午夜在线亚洲| 青青青草视频在线观看| 成人av在线播放| 日韩一级黄色片| 亚洲女人国产香蕉久久精品| 日本在线播放一区| 韩国毛片| 久久99这里只有精品国产| 成人高清免费| 国产麻豆精品免费视频| 欧美日本二区| 国产精品自拍一区| 亚洲精品久久久中文字| 精品久久久久久中文字幕2017| 青青久久精品| 欧美国产日韩一区二区三区| 国产不卡福利| 欧美日本免费| 四虎久久精品国产| 欧美大片aaaa一级毛片| 四虎久久精品国产| 欧美国产日韩一区二区三区| 999久久狠狠免费精品| 国产一区二区精品| 999久久狠狠免费精品| 日韩专区第一页| 亚洲女人国产香蕉久久精品| 成人免费观看男女羞羞视频| 成人免费一级纶理片| 精品在线观看国产| 一级毛片视频播放| 成人免费高清视频| 欧美激情一区二区三区视频高清 | 日韩一级黄色| 91麻豆国产| 精品国产亚洲一区二区三区| 免费国产在线视频| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 欧美激情中文字幕一区二区| 青青青草视频在线观看| 日韩一级黄色| 日本特黄特黄aaaaa大片| 欧美激情一区二区三区在线播放 | 精品久久久久久中文| 国产91精品一区二区| 亚飞与亚基在线观看| 久久精品大片| 你懂的日韩| 国产一区二区精品久久91| 91麻豆精品国产片在线观看| 日日日夜夜操| 欧美大片aaaa一级毛片| 国产成人精品综合久久久| 亚洲精品中文字幕久久久久久| 黄视频网站免费看| 欧美日本二区| 精品视频在线看| 亚欧成人乱码一区二区| 香蕉视频三级| 韩国三级视频网站| 日本在线播放一区| 久久精品欧美一区二区| 深夜做爰性大片中文| 台湾毛片| 成人免费观看男女羞羞视频| 美女被草网站| 深夜做爰性大片中文| 99热精品在线| 九九干| 成人免费一级纶理片| 九九精品在线| 国产成+人+综合+亚洲不卡| 九九九网站| 国产成人女人在线视频观看| 久久精品欧美一区二区| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 毛片成人永久免费视频|