国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区

當前位置:首頁 > 科技  > 軟件

如何實現計數器限流?

來源: 責編: 時間:2023-08-09 23:03:06 427觀看
導讀上一篇文章 go-zero 是如何做路由管理的? 介紹了路由管理,這篇文章來說說限流,主要介紹計數器限流算法,具體的代碼實現,我們還是來分析微服務框架 go-zero 的源碼。在微服務架構中,一個服務可能需要頻繁地與其他服務交互,而

上一篇文章 go-zero 是如何做路由管理的? 介紹了路由管理,這篇文章來說說限流,主要介紹計數器限流算法,具體的代碼實現,我們還是來分析微服務框架 go-zero 的源碼。AUj28資訊網——每日最新資訊28at.com

在微服務架構中,一個服務可能需要頻繁地與其他服務交互,而過多的請求可能導致性能下降或系統崩潰。為了確保系統的穩定性和高可用性,限流算法應運而生。AUj28資訊網——每日最新資訊28at.com

限流算法允許在給定時間段內,對服務的請求流量進行控制和調整,以防止資源耗盡和服務過載。AUj28資訊網——每日最新資訊28at.com

計數器限流算法主要有兩種實現方式,分別是:AUj28資訊網——每日最新資訊28at.com

  1. 固定窗口計數器
  2. 滑動窗口計數器

下面分別來介紹。AUj28資訊網——每日最新資訊28at.com

固定窗口計數器

算法概念如下:AUj28資訊網——每日最新資訊28at.com

  • 將時間劃分為多個窗口;
  • 在每個窗口內每有一次請求就將計數器加一;
  • 如果計數器超過了限制數量,則本窗口內所有的請求都被丟棄當時間到達下一個窗口時,計數器重置。

圖片圖片AUj28資訊網——每日最新資訊28at.com

固定窗口計數器是最為簡單的算法,但這個算法有時會讓通過請求量允許為限制的兩倍。AUj28資訊網——每日最新資訊28at.com

圖片圖片AUj28資訊網——每日最新資訊28at.com

考慮如下情況:限制 1 秒內最多通過 5 個請求,在第一個窗口的最后半秒內通過了 5 個請求,第二個窗口的前半秒內又通過了 5 個請求。這樣看來就是在 1 秒內通過了 10 個請求。AUj28資訊網——每日最新資訊28at.com

滑動窗口計數器

算法概念如下:AUj28資訊網——每日最新資訊28at.com

  • 將時間劃分為多個區間;
  • 在每個區間內每有一次請求就將計數器加一維持一個時間窗口,占據多個區間;
  • 每經過一個區間的時間,則拋棄最老的一個區間,并納入最新的一個區間;
  • 如果當前窗口內區間的請求計數總和超過了限制數量,則本窗口內所有的請求都被丟棄。

圖片圖片AUj28資訊網——每日最新資訊28at.com

滑動窗口計數器是通過將窗口再細分,并且按照時間滑動,這種算法避免了固定窗口計數器帶來的雙倍突發請求,但時間區間的精度越高,算法所需的空間容量就越大。AUj28資訊網——每日最新資訊28at.com

go-zero 實現

go-zero 實現的是固定窗口的方式,計算一段時間內對同一個資源的訪問次數,如果超過指定的 limit,則拒絕訪問。當然如果在一段時間內訪問不同的資源,每一個資源訪問量都不超過 limit,此種情況是不會拒絕的。AUj28資訊網——每日最新資訊28at.com

而在一個分布式系統中,存在多個微服務提供服務。所以當瞬間的流量同時訪問同一個資源,如何讓計數器在分布式系統中正常計數?AUj28資訊網——每日最新資訊28at.com

這里要解決的一個主要問題就是計算的原子性,保證多個計算都能得到正確結果。AUj28資訊網——每日最新資訊28at.com

通過以下兩個方面來解決:AUj28資訊網——每日最新資訊28at.com

  • 使用 redis 的 incrby 做資源訪問計數
  • 采用 lua script 做整個窗口計算,保證計算的原子性

接下來先看一下 lua script 的源碼:AUj28資訊網——每日最新資訊28at.com

// core/limit/periodlimit.goconst periodScript = `local limit = tonumber(ARGV[1])local window = tonumber(ARGV[2])local current = redis.call("INCRBY", KEYS[1], 1)if current == 1 then    redis.call("expire", KEYS[1], window)endif current < limit then    return 1elseif current == limit then    return 2else    return 0end`

主要就是使用 INCRBY 命令來實現,第一次請求需要給 key 加上一個過期時間,到達過期時間之后,key 過期被清楚,重新計數。AUj28資訊網——每日最新資訊28at.com

限流器初始化:AUj28資訊網——每日最新資訊28at.com

type (    // PeriodOption defines the method to customize a PeriodLimit.    PeriodOption func(l *PeriodLimit)    // A PeriodLimit is used to limit requests during a period of time.    PeriodLimit struct {        period     int  // 窗口大小,單位 s        quota      int  // 請求上限        limitStore *redis.Redis        keyPrefix  string   // key 前綴        align      bool    })// NewPeriodLimit returns a PeriodLimit with given parameters.func NewPeriodLimit(period, quota int, limitStore *redis.Redis, keyPrefix string,    opts ...PeriodOption) *PeriodLimit {    limiter := &PeriodLimit{        period:     period,        quota:      quota,        limitStore: limitStore,        keyPrefix:  keyPrefix,    }    for _, opt := range opts {        opt(limiter)    }    return limiter}

調用限流:AUj28資訊網——每日最新資訊28at.com

// key 就是需要被限制的資源標識func (h *PeriodLimit) Take(key string) (int, error) {    return h.TakeCtx(context.Background(), key)}// TakeCtx requests a permit with context, it returns the permit state.func (h *PeriodLimit) TakeCtx(ctx context.Context, key string) (int, error) {    resp, err := h.limitStore.EvalCtx(ctx, periodScript, []string{h.keyPrefix + key}, []string{        strconv.Itoa(h.quota),        strconv.Itoa(h.calcExpireSeconds()),    })    if err != nil {        return Unknown, err    }    code, ok := resp.(int64)    if !ok {        return Unknown, ErrUnknownCode    }    switch code {    case internalOverQuota: // 超過上限        return OverQuota, nil    case internalAllowed:   // 未超過,允許訪問        return Allowed, nil    case internalHitQuota:  // 正好達到限流上限        return HitQuota, nil    default:        return Unknown, ErrUnknownCode    }}

上文已經介紹了,固定時間窗口會有臨界突發問題,并不是那么嚴謹,下篇文章我們來介紹令牌桶限流。AUj28資訊網——每日最新資訊28at.com

以上就是本文的全部內容,如果覺得還不錯的話歡迎點贊,轉發和關注,感謝支持。AUj28資訊網——每日最新資訊28at.com

參考文章:AUj28資訊網——每日最新資訊28at.com

  • https://juejin.cn/post/6895928148521648141
  • https://juejin.cn/post/7051406419823689765
  • https://www.infoq.cn/article/Qg2tX8fyw5Vt-f3HH673

本文鏈接:http://m.rrqrq.com/showinfo-26-5165-0.html如何實現計數器限流?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 繼承與隱藏:Java中父類成員變量的神秘禁忌

下一篇: 如何使用Kafka構建事件驅動的架構?

標簽:
  • 熱門焦點
Top 国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区
国产深夜精品| 日本免费新一区视频| 夜夜夜精品看看| 捆绑调教美女网站视频一区| 成人性视频免费网站| 亚洲激情另类| 在线成人高清不卡| 亚洲欧洲精品一区二区三区| 久草这里只有精品视频| 欧美日韩一卡| 欧美日韩精品一区二区| 中文字幕一区二区在线播放| 麻豆91免费看| 欧美日韩视频一区二区三区| 在线亚洲欧美专区二区| 久久久91精品国产一区二区精品| 亚洲国产视频一区二区| va亚洲va日韩不卡在线观看| 免费国产一区二区| 国产香蕉久久精品综合网| 丝袜美腿亚洲一区| 午夜欧美理论片| 精品婷婷伊人一区三区三| 中文字幕亚洲精品在线观看| 国产精品1024| 色婷婷精品久久二区二区蜜臀av| 久久久久久久久伊人| 蜜芽一区二区三区| 亚洲毛片av| 精品国产91久久久久久久妲己| 亚洲成a人v欧美综合天堂下载 | 看欧美日韩国产| 国产精品美女一区二区三区 | 精品国产乱码91久久久久久网站| 日韩精品电影在线| 亚洲黄色天堂| 国产精品视频一二| 成人国产精品免费观看动漫| 色欧美片视频在线观看 | 国产亚洲精品久久飘花| 国产三级三级三级精品8ⅰ区| 久久www免费人成看片高清| 亚洲精一区二区三区| 国产色一区二区| 麻豆精品91| 国产精品成人免费在线| 99精品在线免费| 欧美电视剧免费全集观看| 毛片不卡一区二区| 久久综合久久久| 亚洲韩国精品一区| 亚洲精品在线免费| 国产精品久久久久三级| 91在线一区二区三区| 欧美成人精品高清在线播放| 精品一区二区三区的国产在线播放 | 一二三区精品| 一级日本不卡的影视| 亚洲黄色天堂| 一区二区视频在线看| 精品动漫3d一区二区三区免费版 | 99国产欧美久久久精品| 精品国产免费一区二区三区香蕉| 国产一区二区三区日韩| 91麻豆精品国产91| 国产麻豆精品95视频| 欧美日韩黄色影视| 国产揄拍国内精品对白| 4438x成人网最大色成网站| 美女任你摸久久| 欧美制服丝袜第一页| 美美哒免费高清在线观看视频一区二区| 亚洲欧美国产精品桃花| 五月天久久比比资源色| 色嗨嗨av一区二区三区| 奇米色777欧美一区二区| 欧美日韩一区久久| 国产盗摄精品一区二区三区在线| 欧美大片一区二区| 欧美日韩免费观看一区| 玉足女爽爽91| 在线亚洲一区二区| 国产成人自拍在线| 欧美激情一区在线| 国产日韩一区欧美| 青娱乐精品视频在线| 在线电影一区二区三区| 99久久精品国产一区| 国产精品国产三级国产普通话三级 | 欧美大度的电影原声| 欧美日韩一区二区高清| 亚洲午夜一二三区视频| 欧美亚洲一区二区在线观看| 懂色av中文一区二区三区| 中文字幕欧美三区| 免费欧美在线| 成人高清视频在线| 国产精品国产三级国产普通话三级| 在线一区亚洲| 韩国av一区二区三区在线观看| 精品久久久久久久久久久久久久久久久| 女女同性女同一区二区三区91| 亚洲天堂a在线| 欧美日韩一区久久| 欧美不卡视频| 日韩电影在线免费| 欧美成人精品高清在线播放 | 日本欧美一区二区三区| 日韩欧美国产不卡| 国产精品久久九九| 国产成人精品影视| 亚洲精品乱码久久久久久日本蜜臀| 日本高清不卡aⅴ免费网站| 成人午夜在线视频| 亚洲国产精品久久久久秋霞影院| 8v天堂国产在线一区二区| 亚洲高清毛片| 丁香婷婷综合色啪| 亚洲午夜电影网| 久久久亚洲欧洲日产国码αv| 亚洲一区二区高清视频| 成人av资源在线观看| 亚洲成av人在线观看| 精品国产一区二区国模嫣然| 亚洲欧美成人| 欧美a级一区| 国内精品久久久久影院薰衣草| 中文字幕亚洲视频| 日韩欧美色综合网站| 色综合久久久久综合体桃花网| 日本精品裸体写真集在线观看 | 亚洲欧美另类图片小说| 欧美精品99久久久**| 国产日韩欧美一区二区| 99精品热视频| 国内精品国产三级国产a久久| 一区二区三区在线观看网站| 日韩精品一区二区三区视频播放| 亚洲一区二区成人| 狠狠入ady亚洲精品经典电影| 精品午夜久久福利影院| 夜夜嗨av一区二区三区中文字幕| 精品久久国产97色综合| 欧美午夜精品久久久久久超碰 | 狠狠色丁香久久婷婷综合_中| 亚洲精品中文在线观看| 国产亚洲综合在线| 欧美一区三区二区| 欧美无砖专区一中文字| 久久国产欧美精品| 亚洲欧洲一二三| 国产一区二区三区无遮挡| 成人ar影院免费观看视频| 蜜桃一区二区三区四区| 爽爽淫人综合网网站| 一区二区三区四区激情| 中文字幕中文字幕在线一区| 国产亚洲精久久久久久| 精品国产乱码久久久久久影片| 精品视频资源站| 欧美性受xxxx| 久久免费99精品久久久久久| 国产日韩1区 | 久久精品国产在热久久| 日韩电影免费一区| 婷婷综合另类小说色区| 亚洲午夜精品久久久久久久久| 日韩伦理免费电影| 国产精品理论片| 中文字幕一区二区三区av| 久久久不卡网国产精品二区| 2020日本不卡一区二区视频| 亚洲精品一区在线观看| 精品国产精品网麻豆系列| 日韩欧美国产一区在线观看| 91精品一区二区三区久久久久久| 欧美人体做爰大胆视频| 欧美精品在线观看播放| 7777精品伊人久久久大香线蕉完整版| 欧美三级中文字幕在线观看| 欧美日韩国产影片| 欧美福利一区二区| 欧美成人一区二区三区| 久久免费偷拍视频| 中文字幕精品综合| 国产精品第13页| 亚洲午夜久久久久久久久电影院| 亚洲妇熟xx妇色黄| 奇米一区二区三区| 国产精品亚洲午夜一区二区三区| 国产成人亚洲精品青草天美| 成人a级免费电影| 欧美精品一区三区在线观看| 激情文学一区| 久久久久国产精品一区二区| 欧美视频在线观看一区二区| 日韩欧美一区二区免费| 国产亚洲欧洲997久久综合| 亚洲欧洲日韩综合一区二区| 一区二区三区四区不卡在线 |