mirror of
https://github.com/umputun/reproxy.git
synced 2024-11-29 12:55:03 +03:00
46 lines
1.1 KiB
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)
|
|
}
|