package strategy import ( "github.com/pkg/errors" "math/rand" ) type RandomStrategy struct { clusterIds []string replicas int32 } func NewRandomStrategy(clusterIds []string, replicas int32) *RandomStrategy { return &RandomStrategy{clusterIds: clusterIds, replicas: replicas, } } func (s *RandomStrategy) Schedule() ([]*AssignedCluster, error) { var results []*AssignedCluster if s.replicas < 1 { return nil, errors.New("replicas must be greater than 0") } if len(s.clusterIds) < 1 { return nil, errors.New("cluster must be greater than 0") } if len(s.clusterIds) == 0 || s.clusterIds == nil { return nil, errors.New("weight must be set") } if s.replicas == 1 { // 创建一个切片来保存每个部分的数量 parts := make([]int32, len(s.clusterIds)) // 剩余要分配的副本数 remaining := s.replicas // 随机分配剩余的副本 for remaining > 0 { // 随机选择一个部分(索引从0到numParts-1) partIndex := rand.Intn(len(s.clusterIds)) // 如果该部分加上一个副本后不会超过总数,则分配一个副本 //if parts[partIndex]+1 <= s.replicas { parts[partIndex]++ remaining-- //} } if len(s.clusterIds) == len(parts) { for i, key := range s.clusterIds { cluster := &AssignedCluster{ClusterId: key, Replicas: parts[i]} results = append(results, cluster) } } } else { // 创建一个切片来保存每个部分的数量 parts := make([]int32, len(s.clusterIds)) // 首先将每个部分都分配至少一个副本 for i := range parts { parts[i] = 1 s.replicas-- } // 剩余要分配的副本数 remaining := s.replicas // 随机分配剩余的副本 for remaining > 0 { // 随机选择一个部分(索引从0到numParts-1) partIndex := rand.Intn(len(s.clusterIds)) // 如果该部分加上一个副本后不会超过总数,则分配一个副本 //if parts[partIndex]+1 <= s.replicas { parts[partIndex]++ remaining-- //} } if len(s.clusterIds) == len(parts) { for i, key := range s.clusterIds { cluster := &AssignedCluster{ClusterId: key, Replicas: parts[i]} results = append(results, cluster) } } } return results, nil }