我正在编写一个连接到另一个 HTTP 服务的应用程序。我想限制我对该外部服务的传出请求。
理想情况下,我想使用此处记录的标准弹性处理程序,以便在弹性方面从配置的最佳实践默认值中受益。
services.AddHttpClient<ExternalServiceGateway>()
.AddStandardResilienceHandler();
但是,由于我知道外部服务的速率限制为 120 请求/秒,因此我想对我的拨出呼叫应用类似的策略。
我可以使用单独配置的
ResiliencePipeline
来实现此目的(见下文),但我想将其与 AddStandardResilienceHandler()
结合起来。有什么办法可以达到这个目的吗?
var pipeline = new ResiliencePipelineBuilder()
.AddRetry(new RetryStrategyOptions
{
ShouldHandle = new PredicateBuilder().Handle<RateLimiterRejectedException>(),
Delay = TimeSpan.FromSeconds(1),
MaxRetryAttempts = 5,
BackoffType = DelayBackoffType.Exponential,
UseJitter = true
})
.AddRateLimiter(new FixedWindowRateLimiter(new FixedWindowRateLimiterOptions()
{
PermitLimit = 2,
Window = TimeSpan.FromSeconds(1)
}))
.Build();
AddStandardResilienceHandler
具有重载,您可以在其中覆盖每个预定义策略的选项。
.AddStandardResilienceHandler(options =>
{
options.AttemptTimeout.Timeout = TimeSpan.FromSeconds(60);
});
速率限制器覆盖有点棘手。您必须获得这样的租约:
.AddStandardResilienceHandler(options =>
{
options.RateLimiter.RateLimiter = args =>
{
var limiter = new FixedWindowRateLimiter(new FixedWindowRateLimiterOptions()
{
PermitLimit = 2,
Window = TimeSpan.FromSeconds(1)
});
return limiter.AcquireAsync();
};
});