-
Notifications
You must be signed in to change notification settings - Fork 5.2k
Closed
Labels
api-approvedAPI was approved in API review, it can be implementedAPI was approved in API review, it can be implementedarea-System.ThreadingblockingMarks issues that we want to fast track in order to unblock other important workMarks issues that we want to fast track in order to unblock other important work
Milestone
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
Metadata
Metadata
Assignees
Labels
api-approvedAPI was approved in API review, it can be implementedAPI was approved in API review, it can be implementedarea-System.ThreadingblockingMarks issues that we want to fast track in order to unblock other important workMarks issues that we want to fast track in order to unblock other important work