ResponseClassifiers for use with finagle-thrift
request/responses.
Thrift (and ThriftMux) services are a bit unusual in that
there is only a single Service from Array[Byte]
to Array[Byte] for all the methods of an IDL's service.
Thrift classifiers should be written in terms
of the Scrooge generated request $Service.$Method.Args type and the
method's response type. This is because there is support in Scrooge
and Thrift.newService/newClient
to deserialize the responses into the expected application types
so that classifiers can be written in a normal way.
val classifier: ResponseClassifier = {
case ReqRep(_, Throw(_: RateLimitedException)) => RetryableFailure
case ReqRep(_, Throw(_: NotFoundException)) => NonRetryableFailure
case ReqRep(_, Return(x: Int)) if x == 0=> NonRetryableFailure
case ReqRep(SocialGraph.Follow.Args(a, b), _) if a <= 0 || b <= 0=> NonRetryableFailure
}
ResponseClassifiers
for use withfinagle-thrift
request/responses.Thrift (and ThriftMux) services are a bit unusual in that there is only a single
Service
fromArray[Byte]
toArray[Byte]
for all the methods of an IDL's service.Thrift classifiers should be written in terms of the Scrooge generated request
$Service.$Method.Args
type and the method's response type. This is because there is support in Scrooge andThrift.newService/newClient
to deserialize the responses into the expected application types so that classifiers can be written in a normal way.Given an idl:
One possible custom classifier would be:
Often times, a good default classifier is ThriftResponseClassifier.ThriftExceptionsAsFailures which treats any Thrift response that deserializes into an Exception as a non-retryable failure.