2015-12-09 22:23:16 +03:00
|
|
|
package selector
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"github.com/micro/go-micro/registry"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Selector builds on the registry as a mechanism to pick nodes
|
|
|
|
// and mark their status. This allows host pools and other things
|
|
|
|
// to be built using various algorithms.
|
|
|
|
type Selector interface {
|
2016-01-05 02:07:56 +03:00
|
|
|
Init(opts ...Option) error
|
|
|
|
Options() Options
|
2015-12-09 22:23:16 +03:00
|
|
|
// Select returns a function which should return the next node
|
|
|
|
Select(service string, opts ...SelectOption) (Next, error)
|
|
|
|
// Mark sets the success/error against a node
|
|
|
|
Mark(service string, node *registry.Node, err error)
|
|
|
|
// Reset returns state back to zero for a service
|
|
|
|
Reset(service string)
|
|
|
|
// Close renders the selector unusable
|
|
|
|
Close() error
|
2015-12-20 00:56:14 +03:00
|
|
|
// Name of the selector
|
|
|
|
String() string
|
2015-12-09 22:23:16 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// Next is a function that returns the next node
|
2016-05-04 00:06:19 +03:00
|
|
|
// based on the selector's strategy
|
2015-12-09 22:23:16 +03:00
|
|
|
type Next func() (*registry.Node, error)
|
|
|
|
|
2016-04-23 22:15:01 +03:00
|
|
|
// Filter is used to filter a service during the selection process
|
|
|
|
type Filter func([]*registry.Service) []*registry.Service
|
2015-12-09 22:23:16 +03:00
|
|
|
|
2016-05-04 00:06:19 +03:00
|
|
|
// Strategy is a selection strategy e.g random, round robin
|
|
|
|
type Strategy func([]*registry.Service) Next
|
|
|
|
|
2015-12-09 22:23:16 +03:00
|
|
|
var (
|
2016-05-04 00:06:19 +03:00
|
|
|
DefaultSelector = newDefaultSelector()
|
2015-12-09 22:23:16 +03:00
|
|
|
|
|
|
|
ErrNotFound = errors.New("not found")
|
|
|
|
ErrNoneAvailable = errors.New("none available")
|
|
|
|
)
|
|
|
|
|
|
|
|
func NewSelector(opts ...Option) Selector {
|
2016-05-04 00:06:19 +03:00
|
|
|
return newDefaultSelector(opts...)
|
2015-12-09 22:23:16 +03:00
|
|
|
}
|