hpds_control_center/internal/balance/weightRoundRobinBalance.go

79 lines
2.0 KiB
Go
Raw Normal View History

2023-03-23 15:58:12 +08:00
package balance
import (
"hpds_control_center/model"
)
// WeightRoundRobinBalance 加权轮询负载
type WeightRoundRobinBalance struct {
curIndex int
rss []*WeightNode
rsw []int
}
type WeightNode struct {
node model.NodeLastStateItem
Weight int //初始化时对节点约定的权重
currentWeight int //节点临时权重,每轮都会变化
effectiveWeight int //有效权重, 默认与weight相同 , totalWeight = sum(effectiveWeight) //出现故障就-1
}
//1, currentWeight = currentWeight + effectiveWeight
//2, 选中最大的currentWeight节点为选中节点
//3, currentWeight = currentWeight - totalWeight
func (r *WeightRoundRobinBalance) Add(params model.NodeLastStateItem) error {
weightCpu := params.CpuUsed
weightMem := float64(params.MemUsed*100) / float64(params.MemUsed)
weightSwap := float64(params.SwapTotal*100) / float64(params.SwapTotal)
weightTask := 0.0
if len(params.ExecTask) > 0 {
weightTask = 0
} else {
weightTask = 100
}
node := &WeightNode{
node: params,
Weight: int(400 - weightCpu - weightMem - weightSwap - weightTask),
}
node.effectiveWeight = node.Weight
r.rss = append(r.rss, node)
return nil
}
func (r *WeightRoundRobinBalance) Next() int64 {
var best *WeightNode
total := 0
for i := 0; i < len(r.rss); i++ {
w := r.rss[i]
//1 计算所有有效权重
total += w.effectiveWeight
//2 修改当前节点临时权重
w.currentWeight += w.effectiveWeight
//3 有效权重默认与权重相同,通讯异常时-1, 通讯成功+1直到恢复到weight大小
if w.effectiveWeight < w.Weight {
w.effectiveWeight++
}
//4 选中最大临时权重节点
if best == nil || w.currentWeight > best.currentWeight {
best = w
}
}
if best == nil {
return 0
}
//5 变更临时权重为 临时权重-有效权重之和
best.currentWeight -= total
return best.node.NodeId
}
func (r *WeightRoundRobinBalance) Get(int64) (int64, error) {
return r.Next(), nil
}
func (r *WeightRoundRobinBalance) Update() {
}