mirror of
https://github.com/XTLS/Xray-core.git
synced 2024-12-22 11:23:32 +02:00
add Round-Robin Strategy to balancer (#2844)
* add Round-Robin Strategy * clean up
This commit is contained in:
parent
9becf02316
commit
01c14a5994
4 changed files with 45 additions and 2 deletions
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package conf
|
||||
|
||||
const (
|
||||
strategyRandom string = "random"
|
||||
strategyLeastPing string = "leastping"
|
||||
strategyRandom string = "random"
|
||||
strategyLeastPing string = "leastping"
|
||||
strategyRoundRobin string = "roundrobin"
|
||||
)
|
||||
|
|
Loading…
Reference in a new issue