濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > Golang加權(quán)輪詢(xún)負(fù)載均衡的實(shí)現(xiàn)

Golang加權(quán)輪詢(xún)負(fù)載均衡的實(shí)現(xiàn)

熱門(mén)標(biāo)簽:壽光微信地圖標(biāo)注 excel地圖標(biāo)注分布數(shù)據(jù) 電話(huà)機(jī)器人軟件免費(fèi) 外呼系統(tǒng)用什么卡 百度地圖標(biāo)注后傳給手機(jī) 評(píng)價(jià)高的400電話(huà)辦理 外呼系統(tǒng)顯本地手機(jī)號(hào) 阿克蘇地圖標(biāo)注 涿州代理外呼系統(tǒng)

實(shí)現(xiàn)加權(quán)輪詢(xún)負(fù)載均衡思路

代碼實(shí)現(xiàn)一個(gè)加權(quán)負(fù)載均衡

  • Weight            初始化時(shí)對(duì)節(jié)點(diǎn)約定的權(quán)重
  • currentWeight     節(jié)點(diǎn)臨時(shí)權(quán)重,每輪都會(huì)變化
  • effectiveWeight   節(jié)點(diǎn)有效權(quán)重,默認(rèn)與Weight相同
  • totalWeight       所有節(jié)點(diǎn)有效權(quán)重之和:sum(effectiveWeight)

代碼實(shí)現(xiàn)一個(gè)加權(quán)負(fù)載均衡

  • currentWeight = currentWeight+effecitveWeight
  • 選中最大的 currentWeight 節(jié)點(diǎn)為選中節(jié)點(diǎn)
  • currentWeight = currentWeight-totalWeight  (4+3+2=9)

所以我們能夠 在表格模擬運(yùn)行情況:

請(qǐng)求次數(shù) 請(qǐng)求前currentWelght 選中的節(jié)點(diǎn) 請(qǐng)求后currentWelght
1 [serverA=4,serverB=3,serverC=2] serverA [serverA=-1,serverB=6,serverC=4]
2 [serverA=-1,serverB=6,serverC=4] serverB [serverA=3,serverB=0,serverC=6]
3 [serverA=3,serverB=0,serverC=6] serverc [serverA=7,serverB=3,serverC=-1]
4 [serverA=7,serverB=3,serverC=-1] serverA [serverA=2,serverB=6,serverC=1]
5 [serverA=2,serverB=6,serverC=1] serverB [serverA=6,serverB=0,serverC=3]
6 [serverA=6,serverB=0,serverC=3] serverA [serverA=1,serverB=3,serverC=5]
7 [serverA=1,serverB=3,serverC=5] serverc [serverA=5,serverB=6,serverC=-2]

加權(quán)輪詢(xún)負(fù)載均衡代碼

package load_balance

import (
 "errors"
 "strconv"

)

type WeightRoundRobinBalance struct {
 curIndex int
 rss      []*WeightNode
 rsw      []int

 //觀(guān)察主體
 conf LoadBalanceConf
}

// 配置主題
type LoadBalanceConf interface {
 GetConf() []string
 WatchConf()
 UpdateConf(conf []string)
}

type WeightNode struct {
 addr            string // 服務(wù)器地址
 weight          int //權(quán)重值
 currentWeight   int //節(jié)點(diǎn)當(dāng)前權(quán)重
 effectiveWeight int //有效權(quán)重
}

func (r *WeightRoundRobinBalance) Add(params ...string) error {
 if len(params) != 2 {
  return errors.New("param len need 2")
 }
 parInt, err := strconv.ParseInt(params[1], 10, 64)
 if err != nil {
  return err
 }
 node := WeightNode{addr: params[0], weight: int(parInt)}
 node.effectiveWeight = node.weight
 r.rss = append(r.rss, node)
 return nil
}

func (r *WeightRoundRobinBalance) Next() string {
 total := 0
 var best *WeightNode
 for i := 0; i  len(r.rss); i++ {
  w := r.rss[i]
  //step 1 統(tǒng)計(jì)所有有效權(quán)重之和
  total += w.effectiveWeight

  //step 2 變更節(jié)點(diǎn)臨時(shí)權(quán)重為的節(jié)點(diǎn)臨時(shí)權(quán)重+節(jié)點(diǎn)有效權(quán)重
  w.currentWeight += w.effectiveWeight

  //step 3 有效權(quán)重默認(rèn)與權(quán)重相同,通訊異常時(shí)-1, 通訊成功+1,直到恢復(fù)到weight大小
  if w.effectiveWeight  w.weight {
   w.effectiveWeight++
  }
  //step 4 選擇最大臨時(shí)權(quán)重點(diǎn)節(jié)點(diǎn)
  if best == nil || w.currentWeight > best.currentWeight {
   best = w
  }
 }
 if best == nil {
  return ""
 }
 //step 5 變更臨時(shí)權(quán)重為 臨時(shí)權(quán)重-有效權(quán)重之和
 best.currentWeight -= total
 return best.addr
}

func (r *WeightRoundRobinBalance) Get(key string) (string, error) {
 return r.Next(), nil
}

func (r *WeightRoundRobinBalance) SetConf(conf LoadBalanceConf) {
 r.conf = conf
}

測(cè)試代碼

package load_balance

import (
 "fmt"
 "testing"
)

func TestLB(t *testing.T) {
 rb := WeightRoundRobinBalance{}
 rb.Add("127.0.0.1:2003", "4") //0
 // rb.Add("127.0.0.1:2004", "3") //1
 rb.Add("127.0.0.1:2005", "2") //2

 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
}

測(cè)試結(jié)果

$ go test
127.0.0.1:2003
127.0.0.1:2005
127.0.0.1:2003
127.0.0.1:2003
127.0.0.1:2005
127.0.0.1:2003
127.0.0.1:2003
127.0.0.1:2005
127.0.0.1:2003
127.0.0.1:2003
127.0.0.1:2005
127.0.0.1:2003
127.0.0.1:2003
127.0.0.1:2005
PASS
ok      gateway/_test/demo      0.080s

## 127.0.0.1:2003 為 127.0.0.1:2005 權(quán)重兩倍。而從答應(yīng)結(jié)果上看,符合要求

到此這篇關(guān)于Golang加權(quán)輪詢(xún)負(fù)載均衡的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Golang加權(quán)輪詢(xún)負(fù)載均衡內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

您可能感興趣的文章:
  • Golang實(shí)現(xiàn)四種負(fù)載均衡的算法(隨機(jī),輪詢(xún)等)
  • Golang 實(shí)現(xiàn)簡(jiǎn)單隨機(jī)負(fù)載均衡
  • golang 實(shí)現(xiàn)一個(gè)負(fù)載均衡案例(隨機(jī),輪訓(xùn))
  • Django高并發(fā)負(fù)載均衡實(shí)現(xiàn)原理詳解
  • golang grpc 負(fù)載均衡的方法

標(biāo)簽:吐魯番 雞西 汕頭 蘭州 梅河口 銅川 欽州 重慶

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Golang加權(quán)輪詢(xún)負(fù)載均衡的實(shí)現(xiàn)》,本文關(guān)鍵詞  Golang,加權(quán),輪詢(xún),負(fù)載,均衡,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Golang加權(quán)輪詢(xún)負(fù)載均衡的實(shí)現(xiàn)》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于Golang加權(quán)輪詢(xún)負(fù)載均衡的實(shí)現(xiàn)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    垣曲县| 阜新市| 浑源县| 隆回县| 石城县| 军事| 绵阳市| 连平县| 无棣县| 醴陵市| 清水河县| 金坛市| 叶城县| 嘉禾县| 花莲市| 会昌县| 临沧市| 平山县| 东源县| 斗六市| 南召县| 教育| 连山| 凤山市| 兰坪| 错那县| 安乡县| 嘉兴市| 松阳县| 东兰县| 大足县| 乐陵市| 唐海县| 洛浦县| 化州市| 郯城县| 常州市| 苗栗县| 廉江市| 保亭| 大兴区|