* wip * resolve merge artifacts * full coverage for conductor * wire plugin conductor to main and proxy * wip, with separate match handler * split matching logic with another handler, add initial docs * move parts of proxy to handlers, add tests * add headers in to be sent to proxied url * merged from master * add example with docker compose * supress excesive debug reporting 0-9 disabled in docker * add plugin tests * randomize test port * lint: minor warns * lint: err shadow
Repeater

Repeater calls a function until it returns no error, up to some number of iterations and delays defined by strategy. It terminates immediately on err from the provided (optional) list of critical errors.
Install and update
go get -u github.com/go-pkgz/repeater
How to use
New Repeater created by New(strtg strategy.Interface)
or shortcut for defaults - NewDefault(repeats int, delay time.Duration) *Repeater
.
To activate invoke Do
method. Do
repeats func until no error returned. Predefined (optional) errors terminates the loop immediately.
func (r Repeater) Do(ctx context.Context, fun func() error, errors ...error) (err error)
Repeating strategy
User can provide his own strategy implementing the interface:
type Interface interface {
Start(ctx context.Context) chan struct{}
}
Returned channels used as "ticks," i.e., for each repeat or initial operation one read from this channel needed. Closing this channel indicates "done with retries." It is pretty much the same idea as time.Timer
or time.Tick
implements. Note - the first (technically not-repeated-yet) call won't happen until something sent to the channel. For this reason, the typical strategy sends the first "tick" before the first wait/sleep.
Three most common strategies provided by package and ready to use:
- Fixed delay, up to max number of attempts -
NewFixedDelay(repeats int, delay time.Duration)
. It is the default strategy used byrepeater.NewDefault
constructor - BackOff with jitter provides exponential backoff. It starts from 100ms interval and goes in steps with
last * math.Pow(factor, attempt)
. Optional jitter randomizes intervals a little bit. The strategy created byNewBackoff(repeats int, factor float64, jitter bool)
. Factor = 1 effectively makes this strategy fixed with 100ms delay. - Once strategy does not do any repeats and mainly used for tests/mocks -
NewOnce()