tworandomchoices

package
v1.75.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 4, 2024 License: MIT Imports: 13 Imported by: 0

Documentation

Overview

Package tworandomchoices provides a load balancer implementation that picks two peers at random and chooses the one with fewer pending requests.

The Power of Two Choices in Randomized Load Balancing: https://www.eecs.harvard.edu/~michaelm/postscripts/tpds2001.pdf

The Power of Two Random Choices: A Survey of Techniques and Results: https://www.eecs.harvard.edu/~michaelm/postscripts/handbook2001.pdf

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func NewImplementation added in v1.47.0

func NewImplementation(opts ...Option) abstractlist.Implementation

NewImplementation creates a new fewest pending heap abstractlist.Implementation.

Use this constructor instead of NewList, when wanting to do custom peer connection management.

func Spec

Spec returns a configuration specification for the "fewest pending requests of two random peers" implementation, making it possible to select the better of two random peer with transports that use outbound peer list configuration (like HTTP).

cfg := yarpcconfig.New()
cfg.MustRegisterPeerList(tworandomchoices.Spec())

This enables the random peer list:

outbounds:
  otherservice:
    unary:
      http:
        url: https://host:port/rpc
        two-random-choices:
          peers:
            - 127.0.0.1:8080
            - 127.0.0.1:8081

func SpecWithOptions added in v1.42.1

func SpecWithOptions(options ...ListOption) yarpcconfig.PeerListSpec

SpecWithOptions accepts additional list constructor options.

Types

type Configuration added in v1.42.0

type Configuration struct {
	Capacity *int `config:"capacity"`
	FailFast bool `config:"failFast"`
}

Configuration describes how to construct a two-random-choices peer list.

type List

type List struct {
	// contains filtered or unexported fields
}

List is a PeerList that rotates which peers are to be selected randomly

func New

func New(transport peer.Transport, opts ...ListOption) *List

New creates a new fewest pending requests of two random peers peer list.

func (*List) Choose added in v1.43.0

func (l *List) Choose(ctx context.Context, req *transport.Request) (peer peer.Peer, onFinish func(error), err error)

Choose returns a peer, suitable for sending a request.

The peer is not guaranteed to be connected and available, but the peer list makes every attempt to ensure this and minimize the probability that a chosen peer will fail to carry a request.

func (*List) Introspect added in v1.43.0

func (l *List) Introspect() introspection.ChooserStatus

Introspect reveals information about the list to the internal YARPC introspection system.

func (*List) IsRunning added in v1.43.0

func (l *List) IsRunning() bool

IsRunning returns whether the list has started and not yet stopped.

func (*List) NotifyStatusChanged added in v1.43.0

func (l *List) NotifyStatusChanged(pid peer.Identifier)

NotifyStatusChanged forwards a status change notification to an individual peer in the list.

This satisfies the peer.Subscriber interface and should only be used to send notifications in tests. The list's RetainPeer and ReleasePeer methods deal with an individual peer.Subscriber instance for each peer in the list, avoiding a map lookup.

func (*List) Peers added in v1.43.0

func (l *List) Peers() []peer.StatusPeer

Peers produces a slice of all retained peers.

func (*List) Start added in v1.43.0

func (l *List) Start() error

Start causes the peer list to start.

Starting will retain all peers that have been added but not removed the first time it is called.

Start may be called any number of times and in any order in relation to Stop but will only cause the list to start the first time, and only if it has not already been stopped.

func (*List) Stop added in v1.43.0

func (l *List) Stop() error

Stop causes the peer list to stop.

Stopping will release all retained peers to the underlying transport.

Stop may be called any number of times and in order in relation to Start but will only cause the list to stop the first time, and only if it has previously been started.

func (*List) Update added in v1.43.0

func (l *List) Update(updates peer.ListUpdates) error

Update may add and remove logical peers in the list.

The peer list uses a transport to obtain a physical peer for each logical peer. The transport is responsible for informing the peer list whether the peer is available or unavailable, but cannot guarantee that the peer will still be available after it is chosen.

type ListOption

type ListOption interface {
	// contains filtered or unexported methods
}

ListOption customizes the behavior of a fewest pending of two random peers list.

func Capacity

func Capacity(capacity int) ListOption

Capacity specifies the default capacity of the underlying data structures for this list.

Defaults to 10.

func FailFast added in v1.42.0

func FailFast() ListOption

FailFast indicates that the peer list should not wait for a peer to become available when choosing a peer.

This option is preferrable when the better failure mode is to retry from the origin, since another proxy instance might already have a connection.

func Logger added in v1.42.1

func Logger(logger *zap.Logger) ListOption

Logger specifies a logger.

func Seed

func Seed(seed int64) ListOption

Seed specifies the seed for generating random choices.

func Source

func Source(source rand.Source) ListOption

Source is a source of randomness for the peer list.

type Option added in v1.47.0

type Option interface {
	// contains filtered or unexported methods
}

Option configures the peer list implementation constructor.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL