add Round-Robin Strategy to balancer (#2844)

* add Round-Robin Strategy

* clean up
This commit is contained in:
Hossin Asaadi 2023-12-24 23:29:10 +03:00 committed by GitHub
parent 9becf02316
commit 01c14a5994
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 45 additions and 2 deletions

View file

@ -2,6 +2,7 @@ package router
import ( import (
"context" "context"
sync "sync"
"github.com/xtls/xray-core/common/dice" "github.com/xtls/xray-core/common/dice"
"github.com/xtls/xray-core/features/extension" "github.com/xtls/xray-core/features/extension"
@ -23,6 +24,39 @@ func (s *RandomStrategy) PickOutbound(tags []string) string {
return tags[dice.Roll(n)] return tags[dice.Roll(n)]
} }
type RoundRobinStrategy struct {
mu sync.Mutex
tags []string
index int
roundRobin *RoundRobinStrategy
}
func NewRoundRobin(tags []string) *RoundRobinStrategy {
return &RoundRobinStrategy{
tags: tags,
}
}
func (r *RoundRobinStrategy) NextTag() string {
r.mu.Lock()
defer r.mu.Unlock()
tags := r.tags[r.index]
r.index = (r.index + 1) % len(r.tags)
return tags
}
func (s *RoundRobinStrategy) PickOutbound(tags []string) string {
if len(tags) == 0 {
panic("0 tags")
}
if s.roundRobin == nil {
s.roundRobin = NewRoundRobin(tags)
}
tag := s.roundRobin.NextTag()
return tag
}
type Balancer struct { type Balancer struct {
selectors []string selectors []string
strategy BalancingStrategy strategy BalancingStrategy

View file

@ -129,6 +129,12 @@ func (br *BalancingRule) Build(ohm outbound.Manager) (*Balancer, error) {
strategy: &LeastPingStrategy{}, strategy: &LeastPingStrategy{},
ohm: ohm, ohm: ohm,
}, nil }, nil
case "roundRobin":
return &Balancer{
selectors: br.OutboundSelector,
strategy: &RoundRobinStrategy{},
ohm: ohm,
}, nil
case "random": case "random":
fallthrough fallthrough
default: default:

View file

@ -43,6 +43,8 @@ func (r *BalancingRule) Build() (*router.BalancingRule, error) {
strategy = strategyRandom strategy = strategyRandom
case strategyLeastPing: case strategyLeastPing:
strategy = "leastPing" strategy = "leastPing"
case strategyRoundRobin:
strategy = "roundRobin"
default: default:
return nil, newError("unknown balancing strategy: " + r.Strategy.Type) return nil, newError("unknown balancing strategy: " + r.Strategy.Type)
} }

View file

@ -1,6 +1,7 @@
package conf package conf
const ( const (
strategyRandom string = "random" strategyRandom string = "random"
strategyLeastPing string = "leastping" strategyLeastPing string = "leastping"
strategyRoundRobin string = "roundrobin"
) )