91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

go-zero 中怎樣扛住流量沖擊

發布時間:2021-08-13 11:37:52 來源:億速云 閱讀:174 作者:Leah 欄目:編程語言

這期內容當中小編將會給大家帶來有關go-zero 中怎樣扛住流量沖擊,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

go-zero 如何扛住流量沖擊(一)

不管是在單體服務中還是在微服務中,開發者為前端提供的API接口都是有訪問上限的,當訪問頻率或者并發量超過其承受范圍時候,我們就必須考慮限流來保證接口的可用性或者降級可用性。即接口也需要安裝上保險絲,以防止非預期的請求對系統壓力過大而引起的系統癱瘓。

go-zero 集成了開箱即用的 限流器 。其中內置了兩種限流器,也對應兩類使用場景:

種類原理場景
periodlimit單位時間限制訪問次數需要強行限制數據的傳輸速率
tokenlimit令牌桶限流限制數據的平均傳輸速率,同時允許某種程度的突發傳輸

使用

const (
    seconds = 1
    total   = 100
    quota   = 5
)
// New limiter
l := NewPeriodLimit(seconds, quota, redis.NewRedis(s.Addr(), redis.NodeType), "periodlimit")

// take source
code, err := l.Take("first")
if err != nil {
    logx.Error(err)
    return true
}

// switch val => process request
switch code {
    case limit.OverQuota:
        logx.Errorf("OverQuota key: %v", key)
        return false
    case limit.Allowed:
        logx.Infof("AllowedQuota key: %v", key)
        return true
    case limit.HitQuota:
        logx.Errorf("HitQuota key: %v", key)
        // todo: maybe we need to let users know they hit the quota
        return false
    default:
        logx.Errorf("DefaultQuota key: %v", key)
        // unknown response, we just let the sms go
        return true
}

periodlimit

go-zero 采取 滑動窗口 計數的方式,計算一段時間內對同一個資源的訪問次數,如果超過指定的 limit ,則拒絕訪問。當然如果你是在一段時間內訪問不同的資源,每一個資源訪問量都不超過 limit ,此種情況是允許大量請求進來的。

而在一個分布式系統中,存在多個微服務提供服務。所以當瞬間的流量同時訪問同一個資源,如何讓計數器在分布式系統中正常計數? 同時在計算資源訪問時,可能會涉及多個計算,如何保證計算的原子性?

  • go-zero 借助 redisincrby 做資源訪問計數

  • 采用 lua script 做整個窗口計算,保證計算的原子性

下面來看看 lua script 控制的幾個關鍵屬性:

argumentmean
key[1]訪問資源的標示
ARGV[1]limit => 請求總數,超過則限速。可設置為 QPS
ARGV[2]window大小 => 滑動窗口,用 ttl 模擬出滑動的效果
-- to be compatible with aliyun redis, 
-- we cannot use `local key = KEYS[1]` to reuse thekey
local limit = tonumber(ARGV[1])
local window = tonumber(ARGV[2])
-- incrbt key 1 => key visis++
local current = redis.call("INCRBY", KEYS[1], 1)
-- 如果是第一次訪問,設置過期時間 => TTL = window size
-- 因為是只限制一段時間的訪問次數
if current == 1 then
    redis.call("expire", KEYS[1], window)
    return 1
elseif current < limit then
    return 1
elseif current == limit then
    return 2
else
    return 0
end

至于上述的 return code ,返回給調用方。由調用方來決定請求后續的操作:

return codetagcall codemean
0OverQuota3over limit
1Allowed1in limit
2HitQuota2hit limit

下面這張圖描述了請求進入的過程,以及請求觸發 limit 時后續發生的情況:

go-zero 中怎樣扛住流量沖擊

go-zero 中怎樣扛住流量沖擊

后續處理

如果在服務某個時間點,請求大批量打進來,periodlimit 短期時間內達到 limit 閾值,而且設置的時間范圍還遠遠沒有到達。后續請求的處理就成為問題。

periodlimit 中并沒有處理,而是返回 code 。把后續請求的處理交給了開發者自己處理。

  1. 如果不做處理,那就是簡單的將請求拒絕

  2. 如果需要處理這些請求,開發者可以借助 mq 將請求緩沖,減緩請求的壓力

  3. 采用 tokenlimit,允許暫時的流量沖擊

上述就是小編為大家分享的go-zero 中怎樣扛住流量沖擊了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泰州市| 丹巴县| 哈巴河县| 吴江市| 高雄县| 西城区| 嘉义县| 临高县| 龙川县| 宁城县| 乐至县| 沧州市| 灵台县| 孝昌县| 乌鲁木齐县| 广河县| 论坛| 获嘉县| 盈江县| 丹东市| 东海县| 德化县| 合江县| 富宁县| 湟源县| 裕民县| 新巴尔虎右旗| 桐柏县| 东兰县| 焦作市| 苏尼特左旗| 辽宁省| 蛟河市| 泸西县| 乐安县| 晋中市| 祁连县| 洮南市| 东城区| 大田县| 兴海县|