亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Golang實現(xiàn)按比例切分流量的示例詳解

 更新時間:2023年09月04日 10:29:43   作者:阿拉懶神燈  
我們在進行灰度發(fā)布時,往往需要轉發(fā)一部分流量到新上線的服務上,進行小規(guī)模的驗證,隨著功能的不斷完善,我們也會逐漸增加轉發(fā)的流量,這就需要按比例去切分流量,那么如何實現(xiàn)流量切分呢,接下來小編就給大家詳細的介紹一下實現(xiàn)方法,需要的朋友可以參考下

我們在進行灰度發(fā)布時,往往需要轉發(fā)一部分流量到新上線的服務上,進行小規(guī)模的驗證,隨著功能的不斷完善,我們也會逐漸增加轉發(fā)的流量,這就需要按比例去切分流量,那么如何實現(xiàn)流量切分呢?

我們很容易想到通過生成隨機數(shù)方式進行實現(xiàn),通過判斷生成隨機數(shù)是否落在指定區(qū)間內,從而決定是否進行流量的轉發(fā),這種方式雖然實現(xiàn)很簡單,但是它有兩點弊端:

  • 每次都要生成新的隨機數(shù),這是有性能損耗的,尤其是并發(fā)量高的場景下更為明顯;
  • 隨機數(shù)的生成往往不夠均勻,比如有A、B兩個服務,流量比例3:7,如果使用隨機數(shù)方式,如果運氣不好的話有可能請求100次全落在B服務上。

那有沒有性能開銷又小,又能精準切分流量的方式呢?當然是有的。實現(xiàn)思路如下:

  • 確定比例,并根據(jù)比例得到一個基數(shù)base,例如比例是3:7,那么基數(shù)就是10;
  • 生成長度為基數(shù)base的數(shù)組source,并填充數(shù)據(jù)0、1、2、3、4、5...;
  • 打亂數(shù)組source中元素順序;
  • 創(chuàng)建全局計數(shù)器queryCount,每次有請求時加1(確保原子性);
  • 計算計數(shù)器queryCount與base取余后的值rate,并得到數(shù)組中對應位置的值source[rate];
  • 判斷source[rate]落在哪個區(qū)間。

看文字可能覺得理解起來有些別扭,這里貼上完整代碼:

import (  "fmt"  "math/rand"  "sync/atomic")
type TrafficControl struct {  
    source     []int  
    queryCount uint32  
    base       int  
    ratio      int
}
func NewTrafficControl(base int, ratio int) *TrafficControl {  
    source := make([]int, base)  
    for i := 0; i < base; i++ {    
        source[i] = i  
    }
    rand.Shuffle(base, func(i, j int) {    
        source[i], source[j] = source[j], source[i]  
    })
    return &TrafficControl{    
        source: source,    
        base:   base,    
        ratio:  ratio,  
    }
}
func (t *TrafficControl) Allow() bool {  
    rate := t.source[int(atomic.AddUint32(&t.queryCount, 1))%t.base]  
    if rate < t.ratio {    
        return true  
    } else {    
        return false  
    }
}

接下來我們檢測下這段代碼是否真的能精準切分流量:

func main() {  
    trafficCtl := NewTrafficControl(10, 6)  
    cnt := 100  
    serviceAQueryCnt := 0  
    serviceBQueryCnt := 0  
    for cnt > 0 {    
        if trafficCtl.Allow() {      
            serviceAQueryCnt++    
        } else {      
            serviceBQueryCnt++    
        }    
        cnt--  
    }
    fmt.Printf("service A query count: %v, service B query count %v", serviceAQueryCnt, serviceBQueryCnt)
}

執(zhí)行結果如下:

service A query count: 60, service B query count 40

其實思路很簡單:通過請求數(shù)與基數(shù)取余,確保在一定范圍內總能按比例 實現(xiàn)流量切分;通過打亂數(shù)組確保流量分布盡可能均勻。當然流量切分還有其他實現(xiàn)方式,如果大家有更精妙的實現(xiàn),歡迎評論區(qū)留言哈。

到此這篇關于Golang實現(xiàn)按比例切分流量的示例詳解的文章就介紹到這了,更多相關Golang按比例切分流量內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go語言中函數(shù)可變參數(shù)(Variadic Parameter)詳解

    Go語言中函數(shù)可變參數(shù)(Variadic Parameter)詳解

    在Python中,在函數(shù)參數(shù)不確定數(shù)量的情況下,可以動態(tài)在函數(shù)內獲取參數(shù)。在Go語言中,也有類似的實現(xiàn)方式,本文就來為大家詳細講解一下
    2022-07-07
  • Golang利用Template模板動態(tài)生成文本

    Golang利用Template模板動態(tài)生成文本

    Go語言中的Go?Template是一種用于生成文本輸出的簡單而強大的模板引擎,它提供了一種靈活的方式來生成各種格式的文本,下面我們就來看看具體如何使用Template實現(xiàn)動態(tài)文本生成吧
    2023-09-09
  • Go?語言結構體鏈表的基本操作

    Go?語言結構體鏈表的基本操作

    鏈表是一種物理存儲單元上非連續(xù)、非順序的存儲結構,數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序實現(xiàn)的,這篇文章主要介紹了Go?語言結構體鏈表,需要的朋友可以參考下
    2022-04-04
  • GoLang channel使用介紹

    GoLang channel使用介紹

    Channel 和 goroutine 的結合是 Go 并發(fā)編程的大殺器。而 Channel 的實際應用也經(jīng)常讓人眼前一亮,通過與 select,cancel,timer 等結合,它能實現(xiàn)各種各樣的功能。接下來,我們就要梳理一下 channel 的應用
    2022-10-10
  • Go利用ffmpeg進行視頻和音頻處理

    Go利用ffmpeg進行視頻和音頻處理

    ffmpeg 是一款功能強大的多媒體處理工具,支持視頻和音頻的編碼、解碼、轉碼,以及幀提取和流處理等功能,下面我們就來看看Go如何利用ffmpeg進行視頻和音頻處理吧
    2024-12-12
  • Golang中interface的基本用法詳解

    Golang中interface的基本用法詳解

    Go 中接口也是一個使用得非常頻繁的特性,好的軟件設計往往離不開接口的使用,比如依賴倒置原則(通過抽象出接口,分離了具體實現(xiàn)與實際使用的耦合)。 今天,就讓我們來了解一下 Go 中接口的一些基本用法
    2023-01-01
  • Go 在 MongoDB 中常用查詢與修改的操作

    Go 在 MongoDB 中常用查詢與修改的操作

    這篇文章主要介紹了Go 在 MongoDB 中常用查詢與修改的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • 利用go語言實現(xiàn)Git?重命名遠程分支??

    利用go語言實現(xiàn)Git?重命名遠程分支??

    這篇文章主要介紹了go語言實現(xiàn)Git?重命名遠程分支,文章基于go語言的基礎展開Git?重命名遠程分支的實現(xiàn)過程,需要的小伙伴可以參考一下,希望對你的學習有所幫助
    2022-06-06
  • Go語言數(shù)據(jù)結構之二叉樹必會知識點總結

    Go語言數(shù)據(jù)結構之二叉樹必會知識點總結

    如果你是一個開發(fā)人員,或多或少對樹型結構都有一定的認識。二叉樹作為樹的一種,是一種重要的數(shù)據(jù)結構,也是面試官經(jīng)??嫉臇|西。本文為大家總結了一些二叉樹必會知識點,需要的可以參考一下
    2022-08-08
  • go語言學習之包和變量詳解

    go語言學習之包和變量詳解

    這篇文章主要給大家愛介紹了關于go語言學習之包和變量的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用go語言具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-06-06

最新評論