-
Notifications
You must be signed in to change notification settings - Fork 84
/
AdaptiveRetryStrategy.ts
61 lines (54 loc) · 2.14 KB
/
AdaptiveRetryStrategy.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import { Provider, RetryErrorInfo, RetryStrategyV2, RetryToken, StandardRetryToken } from "@smithy/types";
import { RETRY_MODES } from "./config";
import { DefaultRateLimiter } from "./DefaultRateLimiter";
import { StandardRetryStrategy } from "./StandardRetryStrategy";
import { RateLimiter } from "./types";
/**
* @public
*
* Strategy options to be passed to AdaptiveRetryStrategy
*/
export interface AdaptiveRetryStrategyOptions {
rateLimiter?: RateLimiter;
}
/**
* @public
*
* The AdaptiveRetryStrategy is a retry strategy for executing against a very
* resource constrained set of resources. Care should be taken when using this
* retry strategy. By default, it uses a dynamic backoff delay based on load
* currently perceived against the downstream resource and performs circuit
* breaking to disable retries in the event of high downstream failures using
* the DefaultRateLimiter.
*
* @see {@link StandardRetryStrategy}
* @see {@link DefaultRateLimiter }
*/
export class AdaptiveRetryStrategy implements RetryStrategyV2 {
private rateLimiter: RateLimiter;
private standardRetryStrategy: StandardRetryStrategy;
public readonly mode: string = RETRY_MODES.ADAPTIVE;
constructor(
private readonly maxAttemptsProvider: Provider<number>,
options?: AdaptiveRetryStrategyOptions
) {
const { rateLimiter } = options ?? {};
this.rateLimiter = rateLimiter ?? new DefaultRateLimiter();
this.standardRetryStrategy = new StandardRetryStrategy(maxAttemptsProvider);
}
public async acquireInitialRetryToken(retryTokenScope: string): Promise<RetryToken> {
await this.rateLimiter.getSendToken();
return this.standardRetryStrategy.acquireInitialRetryToken(retryTokenScope);
}
public async refreshRetryTokenForRetry(
tokenToRenew: StandardRetryToken,
errorInfo: RetryErrorInfo
): Promise<RetryToken> {
this.rateLimiter.updateClientSendingRate(errorInfo);
return this.standardRetryStrategy.refreshRetryTokenForRetry(tokenToRenew, errorInfo);
}
public recordSuccess(token: StandardRetryToken): void {
this.rateLimiter.updateClientSendingRate({});
this.standardRetryStrategy.recordSuccess(token);
}
}