2018-12-29 18:18:05 +02:00
|
|
|
// Package selector is a way to pick a list of service nodes
|
2015-12-09 21:23:16 +02:00
|
|
|
package selector
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
2019-12-03 21:59:44 +02:00
|
|
|
|
2021-10-12 13:55:53 +02:00
|
|
|
"go-micro.dev/v4/registry"
|
2015-12-09 21:23:16 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
// 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 01:07:56 +02:00
|
|
|
Init(opts ...Option) error
|
|
|
|
Options() Options
|
2015-12-09 21:23:16 +02: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-19 23:56:14 +02:00
|
|
|
// Name of the selector
|
|
|
|
String() string
|
2015-12-09 21:23:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// Next is a function that returns the next node
|
2022-09-30 16:27:07 +02:00
|
|
|
// based on the selector's strategy.
|
2015-12-09 21:23:16 +02:00
|
|
|
type Next func() (*registry.Node, error)
|
|
|
|
|
2022-09-30 16:27:07 +02:00
|
|
|
// Filter is used to filter a service during the selection process.
|
2016-04-23 21:15:01 +02:00
|
|
|
type Filter func([]*registry.Service) []*registry.Service
|
2015-12-09 21:23:16 +02:00
|
|
|
|
2022-09-30 16:27:07 +02:00
|
|
|
// Strategy is a selection strategy e.g random, round robin.
|
2016-05-03 23:06:19 +02:00
|
|
|
type Strategy func([]*registry.Service) Next
|
|
|
|
|
2015-12-09 21:23:16 +02:00
|
|
|
var (
|
2018-12-29 17:44:51 +02:00
|
|
|
DefaultSelector = NewSelector()
|
2015-12-09 21:23:16 +02:00
|
|
|
|
|
|
|
ErrNotFound = errors.New("not found")
|
|
|
|
ErrNoneAvailable = errors.New("none available")
|
|
|
|
)
|