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%).
- Alphabetic
- By Inheritance
- NackAdmissionFilter
- SimpleFilter
- Filter
- Function2
- AnyRef
- Any
- Hide All
- Show All
- Public
- All
Instance Constructors
- new NackAdmissionFilter(window: Duration, nackRateThreshold: Double, random: Rng, statsReceiver: StatsReceiver)
Value Members
-
final
def
!=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
##(): Int
- Definition Classes
- AnyRef → Any
-
final
def
==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
agnosticAndThen(next: TypeAgnostic): Filter[Req, Rep, Req, Rep]
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
-
def
andThen(factory: ServiceFactory[Req, Rep]): ServiceFactory[Req, Rep]
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
-
def
andThen(service: Service[Req, Rep]): Service[Req, Rep]
Terminates a filter chain in a Service.
-
def
andThen[Req2, Rep2](next: Filter[Req, Rep, Req2, Rep2]): Filter[Req, Rep, Req2, Rep2]
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.
-
def
andThenIf[Req2 >: Req, Rep2 <: Rep](condAndFilter: (Boolean, Filter[Req, Rep, Req2, Rep2])): Filter[Req, Rep, Req2, Rep2]
Conditionally propagates requests down the filter chain.
Conditionally propagates requests down the filter chain. This may be 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
-
def
andThenIf[Req2 >: Req, Rep2 <: Rep](conditional: Boolean, filter: Filter[Req, Rep, Req2, Rep2]): Filter[Req, Rep, Req2, Rep2]
Conditionally propagates requests down the filter chain.
Conditionally propagates requests down the filter chain. This may be useful if you are statically wiring together filter chains based on a configuration file, for instance.
- conditional
a boolean value indicating whether the filter should be included in the filter chain.
- filter
the filter to be conditionally included.
- Definition Classes
- Filter
-
def
apply(req: Req, service: Service[Req, Rep]): Future[Rep]
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
- NackAdmissionFilter → Filter → Function2
-
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
-
def
clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( ... ) @native()
-
def
curried: (Req) ⇒ (Service[Req, Rep]) ⇒ Future[Rep]
- Definition Classes
- Function2
- Annotations
- @unspecialized()
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
equals(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
finalize(): Unit
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] )
-
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
-
def
hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
-
final
def
isInstanceOf[T0]: Boolean
- Definition Classes
- Any
-
final
def
ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
final
def
notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
-
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
-
def
toString(): String
- Definition Classes
- Filter → Function2 → AnyRef → Any
-
def
tupled: ((Req, Service[Req, Rep])) ⇒ Future[Rep]
- Definition Classes
- Function2
- Annotations
- @unspecialized()
-
final
def
wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... ) @native()