最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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 Gin框架中的binding驗證器使用小結

    Go Gin框架中的binding驗證器使用小結

    Gin框架中的binding驗證器為我們提供了簡便的數(shù)據(jù)綁定和驗證功能,通過合理使用binding和validate標簽,我們可以確保API接口的數(shù)據(jù)合法性和完整性,這篇文章主要介紹了Go Gin框架中的binding驗證器使用指南,需要的朋友可以參考下
    2024-07-07
  • Golang設計模式之外觀模式講解和代碼示例

    Golang設計模式之外觀模式講解和代碼示例

    外觀是一種結構型設計模式, 能為復雜系統(tǒng)、 程序庫或框架提供一個簡單 (但有限) 的接口,這篇文章就給大家詳細介紹一下Golang的外觀模式,文中有詳細的代碼示例,具有一定的參考價值,需要的朋友可以參考下
    2023-06-06
  • GoLang strings.Builder底層實現(xiàn)方法詳解

    GoLang strings.Builder底層實現(xiàn)方法詳解

    自從學習go一個月以來,我多少使用了一下strings.Builder,略有心得。你也許知道它,特別是你了解bytes.Buffer的話。所以我在此分享一下我的心得,并希望能對你有所幫助
    2022-10-10
  • GO中對map排序的實現(xiàn)

    GO中對map排序的實現(xiàn)

    本文主要介紹了GO中對map排序的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • go類型轉換及與C的類型轉換方式

    go類型轉換及與C的類型轉換方式

    這篇文章主要介紹了go類型轉換及與C的類型轉換方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • go mod 安裝依賴 unkown revision問題的解決方案

    go mod 安裝依賴 unkown revision問題的解決方案

    這篇文章主要介紹了go mod 安裝依賴 unkown revision問題的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Golang爬蟲框架 colly的使用

    Golang爬蟲框架 colly的使用

    本文主要介紹了Golang爬蟲框架 colly的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • Go語言新寵:pdqsort排序算法的完美打造

    Go語言新寵:pdqsort排序算法的完美打造

    pdqsort是一種新的排序算法,特別適用于Go語言,它是由Go語言團隊開發(fā)的,旨在提供高效且穩(wěn)定的排序算法,pdqsort采用了一種分治的策略,將數(shù)組分成小塊進行排序,然后再合并這些塊,需要的朋友可以參考下
    2023-10-10
  • Go基礎語法的使用

    Go基礎語法的使用

    本文主要介紹了Go基礎語法的使用,包括標識符、關鍵字、行分隔符、var關鍵字、:=運算符、空格、注釋、package、import、輸入輸出、運算符、條件控制、循環(huán)等,感興趣的可以了解一下
    2023-11-11
  • Ubuntu安裝Go語言運行環(huán)境

    Ubuntu安裝Go語言運行環(huán)境

    由于最近偏愛Ubuntu,在加上作為一門開源語言,在Linux上從源代碼開始搭建環(huán)境更讓人覺得有趣味性。讓我們直接先從Go語言的環(huán)境搭建開始
    2015-04-04

最新評論

许昌县| 富蕴县| 涟源市| 莱西市| 广水市| 灯塔市| 洞头县| 晋江市| 呼伦贝尔市| 乌拉特后旗| 集贤县| 镇赉县| 东明县| 定结县| 渝中区| 云浮市| 罗甸县| 临颍县| 七台河市| 磴口县| 绵阳市| 济源市| 龙井市| 道真| 会泽县| 西平县| 河东区| 西畴县| 余江县| 富蕴县| 含山县| 军事| 玉龙| 新蔡县| 张掖市| 从化市| 视频| 绿春县| 忻州市| 夏邑县| 丹阳市|