[][src]Struct tower_balance::p2c::Balance

pub struct Balance<D: Discover, Req> { /* fields omitted */ }

Distributes requests across inner services using the Power of Two Choices.

As described in the Finagle Guide:

The algorithm randomly picks two services from the set of ready endpoints and selects the least loaded of the two. By repeatedly using this strategy, we can expect a manageable upper bound on the maximum load of any server.

The maximum load variance between any two servers is bound by ln(ln(n)) where n is the number of servers in the cluster.

Note that Balance requires that the Discover you use is Unpin in order to implement Service. This is because it needs to be accessed from Service::poll_ready, which takes &mut self. You can achieve this easily by wrapping your Discover in Box::pin before you construct the Balance instance. For more details, see #319.

Methods

impl<D, Req> Balance<D, Req> where
    D: Discover,
    D::Service: Service<Req>, 
[src]

pub fn new(discover: D, rng: SmallRng) -> Self[src]

Initializes a P2C load balancer from the provided randomization source.

pub fn from_entropy(discover: D) -> Self[src]

Initializes a P2C load balancer from the OS's entropy source.

pub fn len(&self) -> usize[src]

Returns the number of endpoints currently tracked by the balancer.

Trait Implementations

impl<D: Discover, Req> Debug for Balance<D, Req> where
    D: Debug,
    D::Key: Debug,
    D::Service: Debug
[src]

impl<D, Req> Service<Req> for Balance<D, Req> where
    D: Discover + Unpin,
    D::Key: Clone,
    D::Error: Into<Box<dyn Error + Send + Sync>>,
    D::Service: Service<Req> + Load,
    <D::Service as Load>::Metric: Debug,
    <D::Service as Service<Req>>::Error: Into<Box<dyn Error + Send + Sync>>, 
[src]

type Response = <D::Service as Service<Req>>::Response

Responses given by the service.

type Error = Box<dyn Error + Send + Sync>

Errors produced by the service.

type Future = MapErr<<D::Service as Service<Req>>::Future, fn(_: <D::Service as Service<Req>>::Error) -> Box<dyn Error + Send + Sync>>

The future response value.

fn poll_ready(&mut self, cx: &mut Context) -> Poll<Result<(), Self::Error>>[src]

Prepares the balancer to process a request.

When Async::Ready is returned, ready_index is set with a valid index into ready referring to a Service that is ready to disptach a request.

Auto Trait Implementations

impl<D, Req> Send for Balance<D, Req> where
    D: Send,
    Req: Send,
    <D as Discover>::Key: Send,
    <D as Discover>::Service: Send

impl<D, Req> Unpin for Balance<D, Req> where
    D: Unpin,
    Req: Unpin,
    <D as Discover>::Key: Unpin,
    <D as Discover>::Service: Unpin

impl<D, Req> Sync for Balance<D, Req> where
    D: Sync,
    Req: Sync,
    <D as Discover>::Key: Sync,
    <D as Discover>::Service: Sync

impl<D, Req> !UnwindSafe for Balance<D, Req>

impl<D, Req> !RefUnwindSafe for Balance<D, Req>

Blanket Implementations

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> From<T> for T[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<M, S, Target, Request> MakeService<Target, Request> for M where
    M: Service<Target, Response = S>,
    S: Service<Request>, 
[src]

type Response = <S as Service<Request>>::Response

Responses given by the service

type Error = <S as Service<Request>>::Error

Errors produced by the service

type Service = S

The Service value created by this factory

type MakeError = <M as Service<Target>>::Error

Errors produced while building a service.

type Future = <M as Service<Target>>::Future

The future of the Service instance.