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 (
"context"
sync "sync"
"github.com/xtls/xray-core/common/dice"
"github.com/xtls/xray-core/features/extension"
@ -23,6 +24,39 @@ func (s *RandomStrategy) PickOutbound(tags []string) string {
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 {
selectors []string
strategy BalancingStrategy

View file

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

View file

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

View file

@ -3,4 +3,5 @@ package conf
const (
strategyRandom string = "random"
strategyLeastPing string = "leastping"
strategyRoundRobin string = "roundrobin"
)