Documentation
¶
Overview ¶
Package sd defines some interfaces and implementations for service discovery
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ErrNoHosts = errors.New("no hosts available")
ErrNoHosts is the error the balancer must return when there are 0 hosts ready
Functions ¶
This section is empty.
Types ¶
type Balancer ¶
Balancer applies a balancing stategy in order to select the backend host to be used
func NewBalancer ¶
func NewBalancer(subscriber Subscriber) Balancer
NewBalancer returns the best perfomant balancer depending on the number of available processors. If GOMAXPROCS = 1, it returns a round robin LB due there is no contention over the atomic counter. If GOMAXPROCS > 1, it returns a pseudo random LB optimized for scaling over the number of CPUs.
func NewRandomLB ¶
func NewRandomLB(subscriber Subscriber) Balancer
NewRandomLB returns a new balancer using a fastrand pseudorandom generator
Example ¶
balancer := NewRandomLB(FixedSubscriber([]string{"a", "b", "c"}))
// code required in order to make the test deterministic
{
var counter uint32
balancer.(*randomLB).rand = func(max uint32) uint32 {
if max != 3 {
fmt.Println("unexpected max:", max)
}
defer func() { counter++ }()
return counter % max
}
}
for i := 0; i < 5; i++ {
h, err := balancer.Host()
if err != nil {
fmt.Println(err.Error())
continue
}
fmt.Println(h)
}
// output
// a
// b
// c
// a
// b
func NewRoundRobinLB ¶
func NewRoundRobinLB(subscriber Subscriber) Balancer
NewRoundRobinLB returns a new balancer using a round robin strategy and starting at a random position in the set of hosts.
Example ¶
balancer := NewRoundRobinLB(FixedSubscriber([]string{"a", "b", "c"}))
// code required in order to make the test deterministic
balancer.(*roundRobinLB).counter = 1
for i := 0; i < 5; i++ {
h, err := balancer.Host()
if err != nil {
fmt.Println(err.Error())
continue
}
fmt.Println(h)
}
// output
// b
// c
// a
// b
// a
type FixedSubscriber ¶
type FixedSubscriber []string
FixedSubscriber has a constant set of backend hosts and they never get updated
func NewRandomFixedSubscriber ¶
func NewRandomFixedSubscriber(hosts []string) FixedSubscriber
NewRandomFixedSubscriber randomizes a list of hosts and builds a FixedSubscriber with it
func (FixedSubscriber) Hosts ¶
func (s FixedSubscriber) Hosts() ([]string, error)
Hosts implements the subscriber interface
type Register ¶
type Register struct {
// contains filtered or unexported fields
}
Register is a SD register, mapping different SD subscriber factories to their respective name, so they can be accessed by name
func (*Register) Get ¶
func (r *Register) Get(name string) SubscriberFactory
Get returns the SubscriberFactory stored under the given name. It falls back to a FixedSubscriberFactory if there is no factory with that name
type Subscriber ¶
Subscriber keeps the set of backend hosts up to date
func FixedSubscriberFactory ¶
func FixedSubscriberFactory(cfg *config.Backend) Subscriber
FixedSubscriberFactory builds a FixedSubscriber with the received config
type SubscriberFactory ¶
type SubscriberFactory func(*config.Backend) Subscriber
SubscriberFactory builds subscribers with the received config
type SubscriberFunc ¶
SubscriberFunc type is an adapter to allow the use of ordinary functions as subscribers. If f is a function with the appropriate signature, SubscriberFunc(f) is a Subscriber that calls f.
func (SubscriberFunc) Hosts ¶
func (f SubscriberFunc) Hosts() ([]string, error)
Hosts implements the Subscriber interface by executing the wrapped function