/* The Selector package provides a way to algorithmically filter and return nodes required by the client or any other system. Selector's implemented by Micro build on the registry but it's of optional use. One could provide a static Selector that has a fixed pool. */ 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 { Init(opts ...Option) error Options() Options // 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 // Name of the selector String() string } // Next is a function that returns the next node // based on the selector's strategy type Next func() (*registry.Node, error) // Filter is used to filter a service during the selection process type Filter func([]*registry.Service) []*registry.Service // Strategy is a selection strategy e.g random, round robin type Strategy func([]*registry.Service) Next var ( DefaultSelector = newDefaultSelector() ErrNotFound = errors.New("not found") ErrNoneAvailable = errors.New("none available") ) func NewSelector(opts ...Option) Selector { return newDefaultSelector(opts...) }