Vegas

Struct Vegas 

Source
pub struct Vegas { /* private fields */ }
Expand description

Loss- and delay-based congestion avoidance.

Additive increase, additive decrease. Multiplicative decrease when overload detected.

Estimates queuing delay by comparing the current latency with the minimum observed latency to estimate the number of jobs being queued.

For greater stability consider wrapping with a percentile window sampler. This calculates a percentile (e.g. P90) over a period of time and provides that as a sample. Vegas then compares recent P90 latency with the minimum observed P90. Used this way, Vegas can handle heterogeneous workloads, as long as the percentile latency is fairly stable.

Can fairly distribute concurrency between independent clients as long as there is enough server capacity to handle the requests. That is: as long as the server isn’t overloaded and failing to handle requests as a result.

Inspired by TCP Vegas.

Implementations§

Source§

impl Vegas

Source

pub fn new_with_initial_limit(initial_limit: usize) -> Self

Source

pub fn new(initial_limit: usize, limit_range: RangeInclusive<usize>) -> Self

Source

pub fn with_max_limit(self, max: usize) -> Self

Trait Implementations§

Source§

impl Debug for Vegas

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl LimitAlgorithm for Vegas

Source§

fn update<'life0, 'async_trait>( &'life0 self, sample: Sample, ) -> Pin<Box<dyn Future<Output = usize> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Vegas algorithm.

Generally applied over a window size of one or two RTTs.

Little’s law: L = λW = concurrency = rate * latency (averages).

The algorithm in terms of rates:

BASE_D = estimated base latency with no queueing
D(w)   = observed average latency per job over window w
L(w)   = concurrency limit for window w
F(w)   = average jobs in flight during window w

L(w) / BASE_D = E    = expected rate (no queueing)
F(w) / D(w)   = A(w) = actual rate during window w

E - A(w) = DIFF [>= 0]

alpha = low rate threshold: too little queueing
beta  = high rate threshold: too much queueing

L(w+1) = L(w) + 1 if DIFF < alpha
              - 1 if DIFF > beta

Or, using queue size instead of rate:

D(w) - BASE_D = ΔD(w) = extra average latency in window w caused by queueing
A(w) * ΔD(w)  = Q(w)  = estimated average queue size in window w

alpha = low queueing threshold
beta  = high queueing threshold

L(w+1) = L(w) + 1 if Q(w) < alpha
              - 1 if Q(w) > beta
Source§

fn limit(&self) -> usize

The current limit.

Auto Trait Implementations§

§

impl !Freeze for Vegas

§

impl !RefUnwindSafe for Vegas

§

impl Send for Vegas

§

impl Sync for Vegas

§

impl Unpin for Vegas

§

impl !UnwindSafe for Vegas

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<Src, Scheme> ApproxFrom<Src, Scheme> for Src
where Scheme: ApproxScheme,

Source§

type Err = NoError

The error type produced by a failed conversion.
Source§

fn approx_from(src: Src) -> Result<Src, <Src as ApproxFrom<Src, Scheme>>::Err>

Convert the given value into an approximately equivalent representation.
Source§

impl<Dst, Src, Scheme> ApproxInto<Dst, Scheme> for Src
where Dst: ApproxFrom<Src, Scheme>, Scheme: ApproxScheme,

Source§

type Err = <Dst as ApproxFrom<Src, Scheme>>::Err

The error type produced by a failed conversion.
Source§

fn approx_into(self) -> Result<Dst, <Src as ApproxInto<Dst, Scheme>>::Err>

Convert the subject into an approximately equivalent representation.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T, Dst> ConvAsUtil<Dst> for T

Source§

fn approx(self) -> Result<Dst, Self::Err>
where Self: Sized + ApproxInto<Dst>,

Approximate the subject with the default scheme.
Source§

fn approx_by<Scheme>(self) -> Result<Dst, Self::Err>
where Self: Sized + ApproxInto<Dst, Scheme>, Scheme: ApproxScheme,

Approximate the subject with a specific scheme.
Source§

impl<T> ConvUtil for T

Source§

fn approx_as<Dst>(self) -> Result<Dst, Self::Err>
where Self: Sized + ApproxInto<Dst>,

Approximate the subject to a given type with the default scheme.
Source§

fn approx_as_by<Dst, Scheme>(self) -> Result<Dst, Self::Err>
where Self: Sized + ApproxInto<Dst, Scheme>, Scheme: ApproxScheme,

Approximate the subject to a given type with a specific scheme.
Source§

fn into_as<Dst>(self) -> Dst
where Self: Sized + Into<Dst>,

Convert the subject to a given type.
Source§

fn try_as<Dst>(self) -> Result<Dst, Self::Err>
where Self: Sized + TryInto<Dst>,

Attempt to convert the subject to a given type.
Source§

fn value_as<Dst>(self) -> Result<Dst, Self::Err>
where Self: Sized + ValueInto<Dst>,

Attempt a value conversion of the subject to a given type.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<Src> TryFrom<Src> for Src

Source§

type Err = NoError

The error type produced by a failed conversion.
Source§

fn try_from(src: Src) -> Result<Src, <Src as TryFrom<Src>>::Err>

Convert the given value into the subject type.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<Src, Dst> TryInto<Dst> for Src
where Dst: TryFrom<Src>,

Source§

type Err = <Dst as TryFrom<Src>>::Err

The error type produced by a failed conversion.
Source§

fn try_into(self) -> Result<Dst, <Src as TryInto<Dst>>::Err>

Convert the subject into the destination type.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

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

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<Src> ValueFrom<Src> for Src

Source§

type Err = NoError

The error type produced by a failed conversion.
Source§

fn value_from(src: Src) -> Result<Src, <Src as ValueFrom<Src>>::Err>

Convert the given value into an exactly equivalent representation.
Source§

impl<Src, Dst> ValueInto<Dst> for Src
where Dst: ValueFrom<Src>,

Source§

type Err = <Dst as ValueFrom<Src>>::Err

The error type produced by a failed conversion.
Source§

fn value_into(self) -> Result<Dst, <Src as ValueInto<Dst>>::Err>

Convert the subject into an exactly equivalent representation.