Class/Object

com.twitter.finagle.filter

NackAdmissionFilter

Related Docs: object NackAdmissionFilter | package filter

Permalink

class NackAdmissionFilter[Req, Rep] extends SimpleFilter[Req, Rep]

This filter probabilistically drops requests if the nack rate exceeds the nackRateThreshold. In the case that most or all of the cluster which the client is speaking to is overloaded, this will help the cluster cool off.

The implementation of this filter is heavily inspired by Chapter 21, section "Client-Side Throttling" of O'Reilly's "Site Reliability Engineering: How Google Runs Production Systems", by Beyer, Jones, Petoff, and Murphy, 1e.

NOTE: Here is a brief summary of the configurable params.

A configuration with a nackRateThreshold of N% and a window of duration W roughly translates as, "start dropping some requests to the cluster when the nack rate averages at least N% over a window of duration W."

Here are some examples of situations with param values chosen to make the filter useful:

- Owners of Service A examine their service's nack rate over several days and find that it is almost always under 10% and rarely above 1% (e.g., during traffic spikes) or 5% (e.g., during a data center outage). They do not want to preemptively drop requests unless the cluster sees an extreme overload situation so they choose a nack rate threshold of 20%. And in such a situation they want the filter to act relatively quickly, so they choose a window of 30 seconds.

- Owners of Service B observe that excess load typically causes peak nack rates of around 25% for up to 60 seconds. They want to be aggressive about avoiding cluster overload and don’t mind dropping some innocent requests during mild load so they choose a window of 10 seconds and a threshold of 0.15 (= 15%).

Linear Supertypes
SimpleFilter[Req, Rep], Filter[Req, Rep, Req, Rep], (Req, Service[Req, Rep]) ⇒ Future[Rep], AnyRef, Any
Ordering
  1. Alphabetic
  2. By Inheritance
Inherited
  1. NackAdmissionFilter
  2. SimpleFilter
  3. Filter
  4. Function2
  5. AnyRef
  6. Any
  1. Hide All
  2. Show All
Visibility
  1. Public
  2. All

Instance Constructors

  1. new NackAdmissionFilter(window: Duration, nackRateThreshold: Double, random: Rng, statsReceiver: StatsReceiver, monoTime: Monotime = new Ema.Monotime)

    Permalink

    window

    Size of moving window for exponential moving average, which is used to keep track of the ratio of nacked responses to accepted responses and compute the client's accept rate. E.g., if set to 1 second, then only requests occurring over the previous second will be used to calculate the EMA. The window size influences how the EMA behaves in roughly the following ways: - an EMA with a shorter window duration will respond more quickly to changes in cluster performance, but will keep a less accurate estimate of the long-term average accept rate; - an EMA with a longer window duration will respond more slowly to changes in cluster performance, but will keep a more accurate estimate of the long- term average accept rate.

    nackRateThreshold

    Constant which determines how aggressively the filter drops requests. For example, if set to 1/2, then the highest nack rate the filter will tolerate before probabilistically dropping requests is 50%; if set to 1/3, then the highest nack rate tolerated is 33.3%. In general, if set to x, the highest nack rate tolerated is x.

    random

    Random number generator used in probability calculation.

Value Members

  1. final def !=(arg0: Any): Boolean

    Permalink
    Definition Classes
    AnyRef → Any
  2. final def ##(): Int

    Permalink
    Definition Classes
    AnyRef → Any
  3. final def ==(arg0: Any): Boolean

    Permalink
    Definition Classes
    AnyRef → Any
  4. def agnosticAndThen(next: TypeAgnostic): Filter[Req, Rep, Req, Rep]

    Permalink

    Convert the Filter.TypeAgnostic filter to a Filter and chain it with andThen.

    Convert the Filter.TypeAgnostic filter to a Filter and chain it with andThen.

    Definition Classes
    Filter
  5. def andThen(factory: ServiceFactory[Req, Rep]): ServiceFactory[Req, Rep]

    Permalink

    Terminates a filter chain in a ServiceFactory.

    Terminates a filter chain in a ServiceFactory. For example,

    myFilter.andThen(myServiceFactory)
    factory

    a service factory that takes the output request type and the input response type.

    Definition Classes
    Filter
  6. def andThen(service: Service[Req, Rep]): Service[Req, Rep]

    Permalink

    Terminates a filter chain in a Service.

    Terminates a filter chain in a Service. For example,

    myFilter.andThen(myService)
    service

    a service that takes the output request type and the input response type.

    Definition Classes
    Filter
  7. def andThen[Req2, Rep2](next: Filter[Req, Rep, Req2, Rep2]): Filter[Req, Rep, Req2, Rep2]

    Permalink

    Chains a series of filters together:

    Chains a series of filters together:

    myModularService = handleExceptions.andThen(thrift2Pojo.andThen(parseString))
    next

    another filter to follow after this one

    Definition Classes
    Filter
    Note

    synchronously thrown exceptions in the underlying service are automatically lifted into Future.exception.

  8. def andThenIf[Req2 >: Req, Rep2 <: Rep](condAndFilter: (Boolean, Filter[Req, Rep, Req2, Rep2])): Filter[Req, Rep, Req2, Rep2]

    Permalink

    Conditionally propagates requests down the filter chain.

    Conditionally propagates requests down the filter chain. This may useful if you are statically wiring together filter chains based on a configuration file, for instance.

    condAndFilter

    a tuple of boolean and filter.

    Definition Classes
    Filter
  9. def apply(req: Req, service: Service[Req, Rep]): Future[Rep]

    Permalink

    This is the method to override/implement to create your own Filter.

    This is the method to override/implement to create your own Filter.

    service

    a service that takes the output request type and the input response type

    Definition Classes
    NackAdmissionFilterFilter → Function2
  10. final def asInstanceOf[T0]: T0

    Permalink
    Definition Classes
    Any
  11. def clone(): AnyRef

    Permalink
    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  12. def curried: (Req) ⇒ (Service[Req, Rep]) ⇒ Future[Rep]

    Permalink
    Definition Classes
    Function2
    Annotations
    @unspecialized()
  13. final def eq(arg0: AnyRef): Boolean

    Permalink
    Definition Classes
    AnyRef
  14. def equals(arg0: Any): Boolean

    Permalink
    Definition Classes
    AnyRef → Any
  15. def finalize(): Unit

    Permalink
    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( classOf[java.lang.Throwable] )
  16. final def getClass(): Class[_]

    Permalink
    Definition Classes
    AnyRef → Any
  17. def hashCode(): Int

    Permalink
    Definition Classes
    AnyRef → Any
  18. final def isInstanceOf[T0]: Boolean

    Permalink
    Definition Classes
    Any
  19. final def ne(arg0: AnyRef): Boolean

    Permalink
    Definition Classes
    AnyRef
  20. final def notify(): Unit

    Permalink
    Definition Classes
    AnyRef
  21. final def notifyAll(): Unit

    Permalink
    Definition Classes
    AnyRef
  22. final def synchronized[T0](arg0: ⇒ T0): T0

    Permalink
    Definition Classes
    AnyRef
  23. def toString(): String

    Permalink
    Definition Classes
    Filter → Function2 → AnyRef → Any
  24. def tupled: ((Req, Service[Req, Rep])) ⇒ Future[Rep]

    Permalink
    Definition Classes
    Function2
    Annotations
    @unspecialized()
  25. final def wait(): Unit

    Permalink
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  26. final def wait(arg0: Long, arg1: Int): Unit

    Permalink
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  27. final def wait(arg0: Long): Unit

    Permalink
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )

Inherited from SimpleFilter[Req, Rep]

Inherited from Filter[Req, Rep, Req, Rep]

Inherited from (Req, Service[Req, Rep]) ⇒ Future[Rep]

Inherited from AnyRef

Inherited from Any

Ungrouped