AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

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

如何實現計數器限流?

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

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

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

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

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

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

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

固定窗口計數器

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

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

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

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

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

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

滑動窗口計數器

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

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

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

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

go-zero 實現

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

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

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

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

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

接下來先看一下 lua script 的源碼:fNR28資訊網——每日最新資訊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 過期被清楚,重新計數。fNR28資訊網——每日最新資訊28at.com

限流器初始化:fNR28資訊網——每日最新資訊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}

調用限流:fNR28資訊網——每日最新資訊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    }}

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

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

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

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

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

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

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

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

標簽:
  • 熱門焦點
  • K60 Pro官方停產 第三方瞬間漲價

    雖然沒有官方宣布,但Redmi的一些高管也已經透露了,Redmi K60 Pro已經停產且不會補貨,這一切都是為了即將到來的K60 Ultra鋪路,屬于廠家的正常操作。但有意思的是該機在停產之后
  • 俄羅斯:將審查iPhone等外國公司設備 保數據安全

    iPhone和特斯拉都屬于在各自領域領頭羊的品牌,推出的產品也也都是數一數二的,但對于一些國家而言,它們的產品可靠性和安全性還是在限制范圍內。近日,俄羅斯聯邦通信、信息技術
  • 7月安卓手機性能榜:紅魔8S Pro再奪榜首

    7月份的手機市場風平浪靜,除了紅魔和努比亞帶來了兩款搭載驍龍8Gen2領先版處理器的新機之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機廠商修整的時間,進入8月份之
  • 5月iOS設備性能榜:M1 M2依舊是榜單前五

    和上個月一樣,沒有新品發布的iOS設備性能榜的上榜設備并沒有什么更替,僅僅只有跑分變化而產生的排名變動,剛剛開始的蘋果WWDC2023,推出的產品也依舊是新款Mac Pro、新款Mac Stu
  • 一文看懂為蘋果Vision Pro開發應用程序

    譯者 | 布加迪審校 | 重樓蘋果的Vision Pro是一款混合現實(MR)頭戴設備。Vision Pro結合了虛擬現實(VR)和增強現實(AR)的沉浸感。其高分辨率顯示屏、先進的傳感器和強大的處理能力
  • 消費結構調整丨巨頭低價博弈,拼多多還卷得動嗎?

    來源:征探財經作者:陳香羽隨著流量紅利的退潮,電商的存量博弈越來越明顯。曾經主攻中高端與品質的淘寶天貓、京東重拾&ldquo;低價&rdquo;口號。而過去與他們錯位競爭的拼多多,靠
  • AI芯片初創公司Tenstorrent獲三星和現代1億美元投資

    Tenstorrent是一家由芯片行業資深人士Jim Keller領導的加拿大初創公司,專注于開發人工智能芯片,該公司周三表示,已經從現代汽車集團和三星投資基金等
  • iQOO Neo8 Pro搶先上架:首發天璣9200+ 安卓性能之王

    經過了一段時間的密集爆料,昨日iQOO官方如期對外宣布:將于5月23日推出全新的iQOO Neo8系列新品,官方稱這是一款擁有旗艦級性能調校的作品。隨著發布時
  • 2022爆款:ROG魔霸6 冰川散熱系統持續護航

    喜逢開學季,各大商家開始推出自己的新產品,進行打折促銷活動。對于忠實的端游愛好者來說,能夠擁有一款夢寐以求的筆記本電腦是一件十分開心的事。但是現在的
Top