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
Output:
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
Output:
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