0Pricing
C# Academy · Урок

Настройка промежуточного ПО ограничения частоты запросов

Применяйте ограничения частоты запросов к конечным точкам и политикам.

«Настройка промежуточного ПО ограничения частоты запросов» — бесплатный урок C# Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.

AddRateLimiter

Конфигурация начинается с AddRateLimiter в контейнере служб. Вы задаёте одну или несколько именованных политик и необязательный глобальный код состояния при отклонении.

builder.Services.AddRateLimiter(options =>
{
    options.RejectionStatusCode =
        StatusCodes.Status429TooManyRequests;
});

Политика фиксированного окна

AddFixedWindowLimiter регистрирует именованную политику. Задайте лимит разрешённых запросов, длительность окна и поведение очереди.

options.AddFixedWindowLimiter("fixed", limiter =>
{
    limiter.PermitLimit = 100;
    limiter.Window = TimeSpan.FromMinutes(1);
    limiter.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
    limiter.QueueLimit = 0;
});

Политика скользящего окна

AddSlidingWindowLimiter добавляет SegmentsPerWindow для управления степенью сглаживания.

options.AddSlidingWindowLimiter("sliding", limiter =>
{
    limiter.PermitLimit = 100;
    limiter.Window = TimeSpan.FromMinutes(1);
    limiter.SegmentsPerWindow = 6;
    limiter.QueueLimit = 0;
});

Политика корзины токенов

AddTokenBucketLimiter задаёт размер корзины и скорость её пополнения.

options.AddTokenBucketLimiter("token", limiter =>
{
    limiter.TokenLimit = 100;
    limiter.TokensPerPeriod = 20;
    limiter.ReplenishmentPeriod = TimeSpan.FromSeconds(10);
    limiter.QueueLimit = 0;
});

Политика параллелизма

AddConcurrencyLimiter ограничивает число одновременных запросов.

options.AddConcurrencyLimiter("concurrent", limiter =>
{
    limiter.PermitLimit = 5;
    limiter.QueueLimit = 10;
    limiter.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
});

Добавление промежуточного ПО

Включите ограничение частоты запросов в конвейере с помощью UseRateLimiter. Разместите его в начале, после маршрутизации.

var app = builder.Build();

app.UseRateLimiter();

app.MapControllers();

RequireRateLimiting

Примените именованную политику к конечным точкам с помощью RequireRateLimiting (минимальный API) или атрибута [EnableRateLimiting] (контроллеры).

app.MapGet("/search", () => Results.Ok())
   .RequireRateLimiting("token");

// Controller equivalent:
// [EnableRateLimiting("token")]

Отключение для отдельных конечных точек

Исключите конечную точку из действия группового или глобального ограничителя с помощью DisableRateLimiting или [DisableRateLimiting].

app.MapGet("/health", () => Results.Ok())
   .DisableRateLimiting();

Глобальный ограничитель с разделами

GlobalLimiter применяется к каждому запросу. Используйте PartitionedRateLimiter.Create, чтобы у каждого пользователя или IP был собственный счётчик.

options.GlobalLimiter = PartitionedRateLimiter.Create<HttpContext, string>(
    context =>
    {
        var key = context.User.Identity?.Name
                  ?? context.Connection.RemoteIpAddress?.ToString()
                  ?? "anon";
        return RateLimitPartition.GetFixedWindowLimiter(key, _ =>
            new FixedWindowRateLimiterOptions
            {
                PermitLimit = 100,
                Window = TimeSpan.FromMinutes(1)
            });
    });

Настройка отклонения запросов

OnRejected позволяет добавить заголовок Retry-After или понятное пользователю содержимое ответа, когда запрос отклонён из-за ограничения частоты.

options.OnRejected = async (context, token) =>
{
    if (context.Lease.TryGetMetadata(
            MetadataName.RetryAfter, out var retry))
        context.HttpContext.Response.Headers.RetryAfter =
            ((int)retry.TotalSeconds).ToString();
    await context.HttpContext.Response
        .WriteAsync("Rate limit exceeded.", token);
};

Применение к группе маршрутов

Примените политику ко всей группе маршрутов, чтобы все конечные точки внутри неё использовали общий лимит.

var api = app.MapGroup("/api")
             .RequireRateLimiting("fixed");

api.MapGet("/products", () => Results.Ok());
api.MapGet("/orders", () => Results.Ok());

Быстрая проверка

Проверьте настройку промежуточного ПО.

Итоги

Вы настроили ограничение частоты запросов:

  • AddRateLimiter определяет политики фиксированного окна, скользящего окна, корзины токенов и параллелизма.
  • UseRateLimiter включает промежуточное ПО, а RequireRateLimiting применяет политику.
  • GlobalLimiter вместе с PartitionedRateLimiter создаёт отдельные счётчики для клиентов.
  • OnRejected настраивает ответ 429.

Далее: кэширование результатов.

Часто задаваемые вопросы

Урок «Настройка промежуточного ПО ограничения частоты запросов» бесплатный?

Да — полный текст урока «Настройка промежуточного ПО ограничения частоты запросов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.

Чему я научусь в уроке «Настройка промежуточного ПО ограничения частоты запросов»?

Применяйте ограничения частоты запросов к конечным точкам и политикам. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Настройка промежуточного ПО ограничения частоты запросов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Алгоритмы ограничения частоты запросов
  2. Настройка промежуточного ПО ограничения частоты запросов
  3. Основы кэширования результатов
  4. Политики кэша и его аннулирование
← Назад к C# Academy