backoff

package
v1.19.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 1, 2022 License: MIT Imports: 9 Imported by: 4

Documentation

Index

Constants

View Source
const NoBackoff = time.Duration(-1)

NoBackoff is used to represent backoff when no cron backoff is needed

View Source
const (
	// NoInterval represents Maximim interval
	NoInterval = 0
)

Variables

View Source
var SystemClock = systemClock{}

SystemClock implements Clock interface that uses time.Now().UTC().

Functions

func GetBackoffForNextSchedule added in v0.6.0

func GetBackoffForNextSchedule(cronSchedule string, scheduledTime time.Time, now time.Time) time.Duration

GetBackoffForNextSchedule calculates the backoff time for the next run given a cronSchedule, current scheduled time, and now.

func GetBackoffForNextScheduleNonNegative added in v0.28.0

func GetBackoffForNextScheduleNonNegative(cronSchedule string, scheduledTime time.Time, now time.Time) *time.Duration

GetBackoffForNextScheduleNonNegative calculates the backoff time and ensures a non-negative duration.

func IgnoreErrors

func IgnoreErrors(errorsToExclude []error) func(error) bool

IgnoreErrors can be used as IsRetryable handler for Retry function to exclude certain errors from the retry list

func JitDuration added in v0.27.0

func JitDuration(duration time.Duration, coefficient float64) time.Duration

JitDuration return random duration from (1-coefficient)*duration to (1+coefficient)*duration, inclusive, exclusive

func JitFloat64 added in v0.27.0

func JitFloat64(input float64, coefficient float64) float64

JitFloat64 return random number from (1-coefficient)*input to (1+coefficient)*input, inclusive, exclusive

func JitInt64 added in v0.27.0

func JitInt64(input int64, coefficient float64) int64

JitInt64 return random number from (1-coefficient)*input to (1+coefficient)*input, inclusive, exclusive

func Retry

func Retry(operation Operation, policy RetryPolicy, isRetryable IsRetryable) error

Retry function can be used to wrap any call with retry logic using the passed in policy. A `nil` IsRetryable predicate will retry all errors. There is a context-aware version of this function: RetryContext. Deprecated: Use ThrottleRetry

func RetryContext added in v1.12.1

func RetryContext(
	ctx context.Context,
	operation OperationCtx,
	policy RetryPolicy,
	isRetryable IsRetryable,
) error

RetryContext is a context-aware version of Retry. Context timeout/cancellation errors are never retried, regardless of IsRetryable. Deprecated: use ThrottleRetryContext,

func ThrottleRetry added in v1.17.1

func ThrottleRetry(operation Operation, policy RetryPolicy, isRetryable IsRetryable) error

ThrottleRetry is a resource aware version of Retry. Resource exhausted error will be retried using a different throttle retry policy, instead of the specified one.

func ThrottleRetryContext added in v1.17.1

func ThrottleRetryContext(
	ctx context.Context,
	operation OperationCtx,
	policy RetryPolicy,
	isRetryable IsRetryable,
) error

ThrottleRetryContext is a context and resource aware version of Retry. Context timeout/cancellation errors are never retried, regardless of IsRetryable. Resource exhausted error will be retried using a different throttle retry policy, instead of the specified one. TODO: allow customizing throttle retry policy and what kind of error are categorized as throttle error.

func ValidateSchedule added in v0.6.0

func ValidateSchedule(cronSchedule string) error

ValidateSchedule validates a cron schedule spec

Types

type Clock

type Clock interface {
	Now() time.Time
}

Clock used by ExponentialRetryPolicy implementation to get the current time. Mainly used for unit testing

type ConcurrentRetrier

type ConcurrentRetrier struct {
	sync.Mutex
	// contains filtered or unexported fields
}

ConcurrentRetrier is used for client-side throttling. It determines whether to throttle outgoing traffic in case downstream backend server rejects requests due to out-of-quota or server busy errors.

func NewConcurrentRetrier

func NewConcurrentRetrier(retryPolicy RetryPolicy) *ConcurrentRetrier

NewConcurrentRetrier returns an instance of concurrent backoff retrier.

func (*ConcurrentRetrier) Failed

func (c *ConcurrentRetrier) Failed()

Failed marks client request failed because backend is busy.

func (*ConcurrentRetrier) Succeeded

func (c *ConcurrentRetrier) Succeeded()

Succeeded marks client request succeeded.

func (*ConcurrentRetrier) Throttle

func (c *ConcurrentRetrier) Throttle()

Throttle Sleep if there were failures since the last success call.

type ExponentialRetryPolicy

type ExponentialRetryPolicy struct {
	// contains filtered or unexported fields
}

ExponentialRetryPolicy provides the implementation for retry policy using a coefficient to compute the next delay. Formula used to compute the next delay is: initialInterval * math.Pow(backoffCoefficient, currentAttempt)

func NewExponentialRetryPolicy

func NewExponentialRetryPolicy(initialInterval time.Duration) *ExponentialRetryPolicy

NewExponentialRetryPolicy returns an instance of ExponentialRetryPolicy using the provided initialInterval

func (*ExponentialRetryPolicy) ComputeNextDelay

func (p *ExponentialRetryPolicy) ComputeNextDelay(elapsedTime time.Duration, numAttempts int) time.Duration

ComputeNextDelay returns the next delay interval. This is used by Retrier to delay calling the operation again

func (*ExponentialRetryPolicy) WithBackoffCoefficient added in v1.17.3

func (p *ExponentialRetryPolicy) WithBackoffCoefficient(backoffCoefficient float64) *ExponentialRetryPolicy

WithBackoffCoefficient sets the coefficient used by ExponentialRetryPolicy to compute next delay for each retry All retries are computed using the following formula: initialInterval * math.Pow(backoffCoefficient, currentAttempt)

func (*ExponentialRetryPolicy) WithExpirationInterval added in v1.17.3

func (p *ExponentialRetryPolicy) WithExpirationInterval(expirationInterval time.Duration) *ExponentialRetryPolicy

WithExpirationInterval sets the absolute expiration interval for all retries

func (*ExponentialRetryPolicy) WithInitialInterval added in v1.17.3

func (p *ExponentialRetryPolicy) WithInitialInterval(initialInterval time.Duration) *ExponentialRetryPolicy

WithInitialInterval sets the initial interval used by ExponentialRetryPolicy for the very first retry All later retries are computed using the following formula: initialInterval * math.Pow(backoffCoefficient, currentAttempt)

func (*ExponentialRetryPolicy) WithMaximumAttempts added in v1.17.3

func (p *ExponentialRetryPolicy) WithMaximumAttempts(maximumAttempts int) *ExponentialRetryPolicy

WithMaximumAttempts sets the maximum number of retry attempts

func (*ExponentialRetryPolicy) WithMaximumInterval added in v1.17.3

func (p *ExponentialRetryPolicy) WithMaximumInterval(maximumInterval time.Duration) *ExponentialRetryPolicy

WithMaximumInterval sets the maximum interval for each retry

type IsRetryable

type IsRetryable func(error) bool

IsRetryable handler can be used to exclude certain errors during retry

type Operation

type Operation func() error

Operation to retry

type OperationCtx added in v1.12.1

type OperationCtx func(context.Context) error

OperationCtx plays the same role as Operation but for context-aware retryable functions.

type Retrier

type Retrier interface {
	NextBackOff() time.Duration
	Reset()
}

Retrier manages the state of retry operation

func NewRetrier

func NewRetrier(policy RetryPolicy, clock Clock) Retrier

NewRetrier is used for creating a new instance of Retrier

type RetryPolicy

type RetryPolicy interface {
	ComputeNextDelay(elapsedTime time.Duration, numAttempts int) time.Duration
}

RetryPolicy is the API which needs to be implemented by various retry policy implementations

type TwoPhaseRetryPolicy added in v1.1.0

type TwoPhaseRetryPolicy struct {
	// contains filtered or unexported fields
}

TwoPhaseRetryPolicy implements a policy that first use one policy to get next delay, and once expired use the second policy for the following retry. It can achieve fast retries in first phase then slowly retires in second phase.

func (*TwoPhaseRetryPolicy) ComputeNextDelay added in v1.1.0

func (tp *TwoPhaseRetryPolicy) ComputeNextDelay(elapsedTime time.Duration, numAttempts int) time.Duration

ComputeNextDelay returns the next delay interval.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL