Nginx's Smooth Weighted Round-Robin Balanceing

Nginx’s Smooth Weighted Round-Robin Balanceing

golang实现的nginx的加权轮训算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
func SWRBBalance(nodes []*node) {
totalBalance := getTotalBalance(nodes)
i := 1
for {
//like netWork I/O
time.Sleep(time.Second)
s := selectNode(nodes, totalBalance)
//print selectNode
log.Println("no.", i, "--selected nodeName:", s.Name)
//index
i++
}
}
func getTotalBalance(nodes []*node) (res int) {
for _, v := range nodes {
res = res + v.Value
}
return
}
func selectNode(nodes []*node, totalBalance int) (res *node) {
nodeIndex := 0
for i := 0; i < len(nodes); i++ {
if res == nil {
res = nodes[i]
} else {
if nodes[i].CurrentValue > res.CurrentValue {
res = nodes[i]
nodeIndex = i
}
}
}
for i := 0; i < len(nodes); i++ {
nodes[i].CurrentValue += nodes[i].Value
}
nodes[nodeIndex].CurrentValue -= totalBalance
return res
}

结果及图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2019/04/11 12:10:12 no. 10 --selected nodeName: C-3
2019/04/11 12:10:13 no. 11 --selected nodeName: B-2
2019/04/11 12:10:14 no. 12 --selected nodeName: C-3
2019/04/11 12:10:15 no. 13 --selected nodeName: C-3
2019/04/11 12:10:16 no. 14 --selected nodeName: B-2
2019/04/11 12:10:17 no. 15 --selected nodeName: A-1
2019/04/11 12:10:18 no. 16 --selected nodeName: C-3
2019/04/11 12:10:19 no. 17 --selected nodeName: B-2
2019/04/11 12:10:20 no. 18 --selected nodeName: C-3
2019/04/11 12:10:21 no. 19 --selected nodeName: C-3
2019/04/11 12:10:22 no. 20 --selected nodeName: B-2
2019/04/11 12:10:23 no. 21 --selected nodeName: A-1
2019/04/11 12:10:24 no. 22 --selected nodeName: C-3
2019/04/11 12:10:25 no. 23 --selected nodeName: B-2
2019/04/11 12:10:26 no. 24 --selected nodeName: C-3
2019/04/11 12:10:27 no. 25 --selected nodeName: C-3
2019/04/11 12:10:28 no. 26 --selected nodeName: B-2
2019/04/11 12:10:29 no. 27 --selected nodeName: A-1
2019/04/11 12:10:30 no. 28 --selected nodeName: C-3
2019/04/11 12:10:31 no. 29 --selected nodeName: B-2
2019/04/11 12:10:32 no. 30 --selected nodeName: C-3
2019/04/11 12:10:33 no. 31 --selected nodeName: C-3
2019/04/11 12:10:34 no. 32 --selected nodeName: B-2
2019/04/11 12:10:35 no. 33 --selected nodeName: A-1
2019/04/11 12:10:36 no. 34 --selected nodeName: C-3
2019/04/11 12:10:37 no. 35 --selected nodeName: B-2
2019/04/11 12:10:38 no. 36 --selected nodeName: C-3