日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

如何實(shí)現(xiàn)計(jì)數(shù)器限流?

來(lái)源: 責(zé)編: 時(shí)間:2023-08-09 23:03:06 335觀看
導(dǎo)讀上一篇文章 go-zero 是如何做路由管理的? 介紹了路由管理,這篇文章來(lái)說(shuō)說(shuō)限流,主要介紹計(jì)數(shù)器限流算法,具體的代碼實(shí)現(xiàn),我們還是來(lái)分析微服務(wù)框架 go-zero 的源碼。在微服務(wù)架構(gòu)中,一個(gè)服務(wù)可能需要頻繁地與其他服務(wù)交互,而

上一篇文章 go-zero 是如何做路由管理的? 介紹了路由管理,這篇文章來(lái)說(shuō)說(shuō)限流,主要介紹計(jì)數(shù)器限流算法,具體的代碼實(shí)現(xiàn),我們還是來(lái)分析微服務(wù)框架 go-zero 的源碼。SrZ28資訊網(wǎng)——每日最新資訊28at.com

在微服務(wù)架構(gòu)中,一個(gè)服務(wù)可能需要頻繁地與其他服務(wù)交互,而過(guò)多的請(qǐng)求可能導(dǎo)致性能下降或系統(tǒng)崩潰。為了確保系統(tǒng)的穩(wěn)定性和高可用性,限流算法應(yīng)運(yùn)而生。SrZ28資訊網(wǎng)——每日最新資訊28at.com

限流算法允許在給定時(shí)間段內(nèi),對(duì)服務(wù)的請(qǐng)求流量進(jìn)行控制和調(diào)整,以防止資源耗盡和服務(wù)過(guò)載。SrZ28資訊網(wǎng)——每日最新資訊28at.com

計(jì)數(shù)器限流算法主要有兩種實(shí)現(xiàn)方式,分別是:SrZ28資訊網(wǎng)——每日最新資訊28at.com

  1. 固定窗口計(jì)數(shù)器
  2. 滑動(dòng)窗口計(jì)數(shù)器

下面分別來(lái)介紹。SrZ28資訊網(wǎng)——每日最新資訊28at.com

固定窗口計(jì)數(shù)器

算法概念如下:SrZ28資訊網(wǎng)——每日最新資訊28at.com

  • 將時(shí)間劃分為多個(gè)窗口;
  • 在每個(gè)窗口內(nèi)每有一次請(qǐng)求就將計(jì)數(shù)器加一;
  • 如果計(jì)數(shù)器超過(guò)了限制數(shù)量,則本窗口內(nèi)所有的請(qǐng)求都被丟棄當(dāng)時(shí)間到達(dá)下一個(gè)窗口時(shí),計(jì)數(shù)器重置。

圖片圖片SrZ28資訊網(wǎng)——每日最新資訊28at.com

固定窗口計(jì)數(shù)器是最為簡(jiǎn)單的算法,但這個(gè)算法有時(shí)會(huì)讓通過(guò)請(qǐng)求量允許為限制的兩倍。SrZ28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片SrZ28資訊網(wǎng)——每日最新資訊28at.com

考慮如下情況:限制 1 秒內(nèi)最多通過(guò) 5 個(gè)請(qǐng)求,在第一個(gè)窗口的最后半秒內(nèi)通過(guò)了 5 個(gè)請(qǐng)求,第二個(gè)窗口的前半秒內(nèi)又通過(guò)了 5 個(gè)請(qǐng)求。這樣看來(lái)就是在 1 秒內(nèi)通過(guò)了 10 個(gè)請(qǐng)求。SrZ28資訊網(wǎng)——每日最新資訊28at.com

滑動(dòng)窗口計(jì)數(shù)器

算法概念如下:SrZ28資訊網(wǎng)——每日最新資訊28at.com

  • 將時(shí)間劃分為多個(gè)區(qū)間;
  • 在每個(gè)區(qū)間內(nèi)每有一次請(qǐng)求就將計(jì)數(shù)器加一維持一個(gè)時(shí)間窗口,占據(jù)多個(gè)區(qū)間;
  • 每經(jīng)過(guò)一個(gè)區(qū)間的時(shí)間,則拋棄最老的一個(gè)區(qū)間,并納入最新的一個(gè)區(qū)間;
  • 如果當(dāng)前窗口內(nèi)區(qū)間的請(qǐng)求計(jì)數(shù)總和超過(guò)了限制數(shù)量,則本窗口內(nèi)所有的請(qǐng)求都被丟棄。

圖片圖片SrZ28資訊網(wǎng)——每日最新資訊28at.com

滑動(dòng)窗口計(jì)數(shù)器是通過(guò)將窗口再細(xì)分,并且按照時(shí)間滑動(dòng),這種算法避免了固定窗口計(jì)數(shù)器帶來(lái)的雙倍突發(fā)請(qǐng)求,但時(shí)間區(qū)間的精度越高,算法所需的空間容量就越大。SrZ28資訊網(wǎng)——每日最新資訊28at.com

go-zero 實(shí)現(xiàn)

go-zero 實(shí)現(xiàn)的是固定窗口的方式,計(jì)算一段時(shí)間內(nèi)對(duì)同一個(gè)資源的訪(fǎng)問(wèn)次數(shù),如果超過(guò)指定的 limit,則拒絕訪(fǎng)問(wèn)。當(dāng)然如果在一段時(shí)間內(nèi)訪(fǎng)問(wèn)不同的資源,每一個(gè)資源訪(fǎng)問(wèn)量都不超過(guò) limit,此種情況是不會(huì)拒絕的。SrZ28資訊網(wǎng)——每日最新資訊28at.com

而在一個(gè)分布式系統(tǒng)中,存在多個(gè)微服務(wù)提供服務(wù)。所以當(dāng)瞬間的流量同時(shí)訪(fǎng)問(wèn)同一個(gè)資源,如何讓計(jì)數(shù)器在分布式系統(tǒng)中正常計(jì)數(shù)?SrZ28資訊網(wǎng)——每日最新資訊28at.com

這里要解決的一個(gè)主要問(wèn)題就是計(jì)算的原子性,保證多個(gè)計(jì)算都能得到正確結(jié)果。SrZ28資訊網(wǎng)——每日最新資訊28at.com

通過(guò)以下兩個(gè)方面來(lái)解決:SrZ28資訊網(wǎng)——每日最新資訊28at.com

  • 使用 redis 的 incrby 做資源訪(fǎng)問(wèn)計(jì)數(shù)
  • 采用 lua script 做整個(gè)窗口計(jì)算,保證計(jì)算的原子性

接下來(lái)先看一下 lua script 的源碼:SrZ28資訊網(wǎng)——每日最新資訊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 命令來(lái)實(shí)現(xiàn),第一次請(qǐng)求需要給 key 加上一個(gè)過(guò)期時(shí)間,到達(dá)過(guò)期時(shí)間之后,key 過(guò)期被清楚,重新計(jì)數(shù)。SrZ28資訊網(wǎng)——每日最新資訊28at.com

限流器初始化:SrZ28資訊網(wǎng)——每日最新資訊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  // 請(qǐng)求上限        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}

調(diào)用限流:SrZ28資訊網(wǎng)——每日最新資訊28at.com

// key 就是需要被限制的資源標(biāo)識(shí)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: // 超過(guò)上限        return OverQuota, nil    case internalAllowed:   // 未超過(guò),允許訪(fǎng)問(wèn)        return Allowed, nil    case internalHitQuota:  // 正好達(dá)到限流上限        return HitQuota, nil    default:        return Unknown, ErrUnknownCode    }}

上文已經(jīng)介紹了,固定時(shí)間窗口會(huì)有臨界突發(fā)問(wèn)題,并不是那么嚴(yán)謹(jǐn),下篇文章我們來(lái)介紹令牌桶限流。SrZ28資訊網(wǎng)——每日最新資訊28at.com

以上就是本文的全部?jī)?nèi)容,如果覺(jué)得還不錯(cuò)的話(huà)歡迎點(diǎn)贊,轉(zhuǎn)發(fā)和關(guān)注,感謝支持。SrZ28資訊網(wǎng)——每日最新資訊28at.com

參考文章:SrZ28資訊網(wǎng)——每日最新資訊28at.com

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

本文鏈接:http://www.www897cc.com/showinfo-26-5165-0.html如何實(shí)現(xiàn)計(jì)數(shù)器限流?

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

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

下一篇: 如何使用Kafka構(gòu)建事件驅(qū)動(dòng)的架構(gòu)?

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
  • 2023年Q2用戶(hù)偏好榜:12+256G版本成新主流

    3月份的性能榜、性?xún)r(jià)比榜和好評(píng)榜之后,就要輪到2023年的第二季度偏好榜了,上半年的新機(jī)潮已經(jīng)過(guò)去,最明顯的肯定就是大內(nèi)存和存儲(chǔ)的機(jī)型了,另外部分中端機(jī)也取消了屏幕塑料支架
  • JavaScript 混淆及反混淆代碼工具

    介紹在我們開(kāi)始學(xué)習(xí)反混淆之前,我們首先要了解一下代碼混淆。如果不了解代碼是如何混淆的,我們可能無(wú)法成功對(duì)代碼進(jìn)行反混淆,尤其是使用自定義混淆器對(duì)其進(jìn)行混淆時(shí)。什么是混
  • 十個(gè)可以手動(dòng)編寫(xiě)的 JavaScript 數(shù)組 API

    JavaScript 中有很多API,使用得當(dāng),會(huì)很方便,省力不少。 你知道它的原理嗎? 今天這篇文章,我們將對(duì)它們進(jìn)行一次小總結(jié)。現(xiàn)在開(kāi)始吧。1.forEach()forEach()用于遍歷數(shù)組接收一參
  • Temu起訴SHEIN,跨境電商戰(zhàn)事升級(jí)

    來(lái)源 | 伯虎財(cái)經(jīng)(bohuFN)作者 | 陳平安日前據(jù)外媒報(bào)道,拼多多旗下跨境電商平臺(tái)Temu正對(duì)競(jìng)爭(zhēng)對(duì)手SHEIN提起新訴訟,訴狀稱(chēng)Shein&ldquo;利用市場(chǎng)支配力量強(qiáng)迫服裝廠(chǎng)商與之簽訂獨(dú)家
  • 阿里大調(diào)整

    來(lái)源:產(chǎn)品劉有媒體報(bào)道稱(chēng),近期淘寶天貓集團(tuán)啟動(dòng)了近年來(lái)最大的人力制度改革,涉及員工績(jī)效、層級(jí)體系等多個(gè)核心事項(xiàng),目前已形成一個(gè)初步的&ldquo;征求意見(jiàn)版&rdquo;:1、取消P序列
  • 小米公益基金會(huì)捐贈(zèng)2500萬(wàn)元馳援北京、河北暴雨救災(zāi)

    8月2日消息,今日小米科技創(chuàng)始人雷軍在其微博上發(fā)布消息稱(chēng),小米公益基金會(huì)宣布捐贈(zèng)2500萬(wàn)元馳援北京、河北暴雨救災(zāi)。攜手抗災(zāi),京冀安康!以下為公告原文
  • 三星折疊屏手機(jī)去年銷(xiāo)售近1000萬(wàn)臺(tái) 今年目標(biāo)定為1500萬(wàn)

    7月29日消息,三星率先發(fā)力可折疊手機(jī)市場(chǎng),在全球市場(chǎng)已經(jīng)取得了非常亮眼的成績(jī),接下來(lái)會(huì)進(jìn)一步鞏固和擴(kuò)大這一優(yōu)勢(shì)。三星在推出Galaxy Z Flip5和Galax
  • iQOO Neo8 Pro真機(jī)諜照曝光:天璣9200+和V1+旗艦雙芯加持

    去年10月,iQOO推出了iQOO Neo7系列機(jī)型,不僅搭載了天璣9000+,而且是同價(jià)位唯一一款天璣9000+直屏旗艦,一經(jīng)上市便受到了用戶(hù)的廣泛關(guān)注。在時(shí)隔半年后,
  • AI藝術(shù)欣賞體驗(yàn)會(huì)在上海梅賽德斯奔馳中心音樂(lè)俱樂(lè)部上演

    光影交錯(cuò)的鏡像世界,虛實(shí)幻化的視覺(jué)奇觀,虛擬偶像與真人共同主持,這些場(chǎng)景都出現(xiàn)在2019世界人工智能大會(huì)的舞臺(tái)上。8月29日至31日,“AI藝術(shù)欣賞體驗(yàn)會(huì)”在上海
Top 主站蜘蛛池模板: 罗山县| 女性| 兴安县| 防城港市| 新疆| 德保县| 瓮安县| 隆昌县| 湖口县| 通城县| 浏阳市| 城市| 蒲江县| 秦皇岛市| 通渭县| 柘荣县| 游戏| 平罗县| 淮安市| 石泉县| 肇州县| 衡阳市| 封开县| 阳曲县| 阿瓦提县| 太湖县| 郎溪县| 巩留县| 万全县| 锡林浩特市| 治多县| 黄陵县| 会宁县| 阿合奇县| 大足县| 阳谷县| 松原市| 同德县| 松滋市| 东港市| 新安县|