Closed
Description
Background and motivation
Enables us to instantiate RateLimiters in the RateLimitingMiddleware following the traditional pattern (with an Action): dotnet/aspnetcore#42667 (comment)
API Proposal
namespace System.Threading.RateLimiting;
public class sealed TokenBucketRateLimiterOptions
{
- public TokenBucketRateLimiterOptions(int tokenLimit, QueueProcessingOrder queueProcessingOrder, int queueLimit, TimeSpan replenishmentPeriod, int tokensPerPeriod, bool autoReplenishment = true);
+ public TokenBucketRateLimiterOptions();
- public TimeSpan ReplenishmentPeriod { get; }
+ public TimeSpan ReplenishmentPeriod { get; set; }
- public int TokensPerPeriod { get; }
+ public int TokensPerPeriod { get; set; }
- public bool AutoReplenishment { get; }
+ public bool AutoReplenishment { get; set; }
- public int TokenLimit { get; }
+ public int TokenLimit { get; set; }
- public QueueProcessingOrder QueueProcessingOrder { get; }
+ public QueueProcessingOrder QueueProcessingOrder { get; set; }
- public int QueueLimit { get; }
+ public int QueueLimit { get; set; }
}
public class sealed SlidingWindowRateLimiterOptions
{
- public SlidingWindowRateLimiterOptions(int permitLimit, QueueProcessingOrder queueProcessingOrder, int queueLimit, TimeSpan window, int segmentsPerWindow, bool autoReplenishment = true);
+ public SlidingWindowRateLimiterOptions();
- public TimeSpan Window { get; }
+ public TimeSpan Window { get; set; }
- public int SegmentsPerWindow { get; }
+ public int SegmentsPerWindow { get; set; }
- public bool AutoReplenishment { get; }
+ public bool AutoReplenishment { get; set; }
- public int PermitLimit { get; }
+ public int PermitLimit { get; set; }
- public QueueProcessingOrder QueueProcessingOrder { get; }
+ public QueueProcessingOrder QueueProcessingOrder { get; set; }
- public int QueueLimit { get; }
+ public int QueueLimit { get; set; }
}
public class sealed FixedWindowRateLimiterOptions
{
- public FixedWindowRateLimiterOptions(int permitLimit, QueueProcessingOrder queueProcessingOrder, int queueLimit, TimeSpan window, bool autoReplenishment = true);
+ public FixedWindowRateLimiterOptions();
- public TimeSpan Window { get; }
+ public TimeSpan Window { get; set; }
- public bool AutoReplenishment { get; }
+ public bool AutoReplenishment { get; set; }
- public int PermitLimit { get; }
+ public int PermitLimit { get; set; }
- public QueueProcessingOrder QueueProcessingOrder { get; }
+ public QueueProcessingOrder QueueProcessingOrder { get; set; }
- public int QueueLimit { get; }
+ public int QueueLimit { get; set; }
}
public class sealed ConcurrencyLimiterOptions
{
- public ConcurrencyLimiterOptions(int permitLimit, QueueProcessingOrder queueProcessingOrder, int queueLimit);
+ public ConcurrencyLimiterOptions();
- public int PermitLimit { get; }
+ public int PermitLimit { get; set; }
- public QueueProcessingOrder QueueProcessingOrder { get; }
+ public QueueProcessingOrder QueueProcessingOrder { get; set; }
- public int QueueLimit { get; }
+ public int QueueLimit { get; set; }
}
With 0
defaults, and verbose exception messages in the Limiter
constructors.
API Usage
var options = new RateLimiterOptions()
.AddTokenBucketLimiter("myLimiter", options =>
{
options.TokenLimit = 10;
options.QueueProcessingOrder = QueueProcessingOrder.NewestFirst;
options.QueueLimit = 10;
options.ReplenishmentPeriod = TimeSpan.FromSeconds(30);
options.TokensPerPeriod = 5;
});
Alternative Designs
We could keep using it the way it is.
Risks
Hard to think of any