1
0
mirror of https://github.com/duke-git/lancet.git synced 2026-02-04 12:52:28 +08:00

Add custom backoff setter (#176)

Users should have the capability to customize the backoff pattern and accordingly adjust it within the retry mechanism.
This commit is contained in:
donutloop
2024-02-23 03:04:38 +01:00
committed by GitHub
parent 2e1c2276a5
commit 860a499f98
3 changed files with 69 additions and 0 deletions

View File

@@ -44,6 +44,18 @@ func RetryTimes(n uint) Option {
}
}
// RetryWithCustomBackoff set abitary custom backoff strategy
// todo: Add playground link
func RetryWithCustomBackoff(backoffStrategy BackoffStrategy) Option {
if backoffStrategy == nil {
panic("programming error: backoffStrategy must be not nil")
}
return func(rc *RetryConfig) {
rc.backoffStrategy = backoffStrategy
}
}
// RetryWithLinearBackoff set linear strategy backoff
// todo: Add playground link
func RetryWithLinearBackoff(interval time.Duration) Option {

View File

@@ -51,6 +51,35 @@ func ExampleRetryWithLinearBackoff() {
// 3
}
type ExampleCustomBackoffStrategy struct {
interval time.Duration
}
func (c *ExampleCustomBackoffStrategy) CalculateInterval() time.Duration {
return c.interval + 1
}
func ExampleRetryWithCustomBackoff() {
number := 0
increaseNumber := func() error {
number++
if number == 3 {
return nil
}
return errors.New("error occurs")
}
err := Retry(increaseNumber, RetryWithCustomBackoff(&ExampleCustomBackoffStrategy{interval: time.Microsecond * 50}))
if err != nil {
return
}
fmt.Println(number)
// Output:
// 3
}
func ExampleRetryWithExponentialWithJitterBackoff() {
number := 0
increaseNumber := func() error {

View File

@@ -137,6 +137,34 @@ func TestRetryOneShotSucceeded(t *testing.T) {
assert.Equal(1, number)
}
func TestRetryWitCustomBackoffOneShotSucceeded(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestRetryWitCustomBackoffOneShotSucceeded")
var number int
increaseNumber := func() error {
number++
if number == DefaultRetryTimes {
return nil
}
return errors.New("error occurs")
}
err := Retry(increaseNumber, RetryWithCustomBackoff(&TestCustomBackoffStrategy{interval: time.Microsecond * 50}))
assert.IsNil(err)
assert.Equal(5, number)
}
type TestCustomBackoffStrategy struct {
interval time.Duration
}
func (c *TestCustomBackoffStrategy) CalculateInterval() time.Duration {
return c.interval + 1
}
func TestRetryWithExponentialWithJitterBackoffShiftOneShotSucceeded(t *testing.T) {
t.Parallel()