Skip to content

[API Proposal]: make RateLimiterOptions follow Options pattern #72389

Closed
@wtgodbe

Description

@wtgodbe

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

No one assigned

    Labels

    api-approvedAPI was approved in API review, it can be implementedarea-System.ThreadingblockingMarks issues that we want to fast track in order to unblock other important work

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions