reproxy/app/proxy/lb_selector.go

46 lines
1.1 KiB
Go

package proxy
import (
"math/rand"
"sync"
)
// RoundRobinSelector is a simple round-robin selector, thread-safe
type RoundRobinSelector struct {
lastSelected int
mu sync.Mutex
}
// Select returns next backend index
func (r *RoundRobinSelector) Select(n int) int {
r.mu.Lock()
defer r.mu.Unlock()
selected := r.lastSelected
r.lastSelected = (r.lastSelected + 1) % n
return selected
}
// RandomSelector is a random selector, thread-safe
type RandomSelector struct{}
// Select returns random backend index
func (r *RandomSelector) Select(n int) int {
return rand.Intn(n) //nolint:gosec // no need for crypto/rand here
}
// FailoverSelector is a selector with failover, thread-safe
type FailoverSelector struct{}
// Select returns next backend index
func (r *FailoverSelector) Select(_ int) int {
return 0 // dead server won't be in the list, we can safely pick the first one
}
// LBSelectorFunc is a functional adapted for LBSelector to select backend from the list
type LBSelectorFunc func(n int) int
// Select returns backend index
func (f LBSelectorFunc) Select(n int) int {
return f(n)
}