final case class Backoff(logger: TracedLogger, flagCloseable: PerformUnlessClosing, maxRetries: Int, initialDelay: FiniteDuration, maxDelay: Duration, operationName: String, longDescription: String = "", actionable: Option[String] = None, retryLogLevel: Option[Level] = None, suspendRetries: Eval[FiniteDuration] = Eval.now(Duration.Zero))(implicit jitter: Jitter = Jitter.full(maxDelay)) extends RetryWithDelay with Product with Serializable
A retry policy which will back off using a configurable policy which incorporates random jitter. This has the advantage of reducing contention if you have threaded clients using the same service.
val policy = retry.Backoff() val future = policy(issueRequest)
The following pre-made jitter algorithms are available for you to use:
You can choose one like this:
implicit val jitter = retry.Jitter.full(cap = 5.minutes) val policy = retry.Backoff(1 second) val future = policy(issueRequest)
If a jitter policy isn't in scope, it will use Jitter.full by default which tends to cause clients slightly less work at the cost of slightly more time.
For more information about the algorithms, see the following article:
https://www.awsarchitectureblog.com/2015/03/backoff.html
If the retry is not successful after maxRetries
, the future is completed with its last result.
- Alphabetic
- By Inheritance
- Backoff
- Serializable
- Product
- Equals
- RetryWithDelay
- Policy
- AnyRef
- Any
- Hide All
- Show All
- Public
- Protected
Instance Constructors
- new Backoff(logger: TracedLogger, flagCloseable: PerformUnlessClosing, maxRetries: Int, initialDelay: FiniteDuration, maxDelay: Duration, operationName: String, longDescription: String = "", actionable: Option[String] = None, retryLogLevel: Option[Level] = None, suspendRetries: Eval[FiniteDuration] = Eval.now(Duration.Zero))(implicit jitter: Jitter = Jitter.full(maxDelay))
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
- val actionable: Option[String]
- def apply[T](task: => Future[T], retryable: ExceptionRetryable)(implicit success: Success[T], executionContext: ExecutionContext, traceContext: TraceContext): Future[T]
A com.digitalasset.canton.util.retry.Success criteria is supplied to determine whether the future-based task has succeeded, or if it should perhaps be retried.
A com.digitalasset.canton.util.retry.Success criteria is supplied to determine whether the future-based task has succeeded, or if it should perhaps be retried. Retries are not performed after the com.digitalasset.canton.lifecycle.FlagCloseable has been closed. In that case, the Future is completed with the last result (even if it is an outcome that doesn't satisfy the
success
predicate).- Definition Classes
- RetryWithDelay → Policy
- final def asInstanceOf[T0]: T0
- Definition Classes
- Any
- def clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.CloneNotSupportedException]) @native() @HotSpotIntrinsicCandidate()
- val directExecutionContext: DirectExecutionContext
- Attributes
- protected
- Definition Classes
- Policy
- final def eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- val flagCloseable: PerformUnlessClosing
- final def getClass(): Class[_ <: AnyRef]
- Definition Classes
- AnyRef → Any
- Annotations
- @native() @HotSpotIntrinsicCandidate()
- val initialDelay: FiniteDuration
- final def isInstanceOf[T0]: Boolean
- Definition Classes
- Any
- val logger: TracedLogger
- val longDescription: String
- val maxDelay: Duration
- val maxRetries: Int
- final def ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- def nextDelay(nextCount: Int, delay: FiniteDuration): FiniteDuration
- Definition Classes
- Backoff → RetryWithDelay
- final def notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native() @HotSpotIntrinsicCandidate()
- final def notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native() @HotSpotIntrinsicCandidate()
- val operationName: String
- def productElementNames: Iterator[String]
- Definition Classes
- Product
- val retryLogLevel: Option[Level]
- val suspendRetries: Eval[FiniteDuration]
- final def synchronized[T0](arg0: => T0): T0
- Definition Classes
- AnyRef
- def unlessShutdown[T](task: => FutureUnlessShutdown[T], retryable: ExceptionRetryable)(implicit success: Success[T], executionContext: ExecutionContext, traceContext: TraceContext): FutureUnlessShutdown[T]
In contrast to com.digitalasset.canton.util.retry.RetryWithDelay.apply, this Policy completes the returned future with
AbortedDueToShutdown
if the retry is aborted due to the corresponding com.digitalasset.canton.lifecycle.FlagCloseable being closed or if the task itself reports a shutdown (and not with the last result).In contrast to com.digitalasset.canton.util.retry.RetryWithDelay.apply, this Policy completes the returned future with
AbortedDueToShutdown
if the retry is aborted due to the corresponding com.digitalasset.canton.lifecycle.FlagCloseable being closed or if the task itself reports a shutdown (and not with the last result).Unless your task does already naturally return a
FutureUnlessShutdown[T]
, using com.digitalasset.canton.util.retry.RetryWithDelay.apply is likely sufficient to make it robust against shutdowns.- Definition Classes
- RetryWithDelay → Policy
- final def wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException]) @native()
- final def wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])