如何配置StandardResilienceHandler的速率限制器

问题描述 投票:0回答:1

我正在编写一个连接到另一个 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();
c# .net rate-limiting polly
1个回答
0
投票

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();
    };
});
© www.soinside.com 2019 - 2024. All rights reserved.