Этот проект, это моя попытка (достаточно успешная) сдеалть алгоритм SlidingWindow с очередью запросов на .Net
В отличие от Fixed Window Rate Limiter, который группирует запросы в сегмент на основе очень определенного временного окна, Sliding Window Rate Limiting ограничивает запросы относительно временной метки текущего запроса. Например, если у вас есть ограничитель скорости 10 запросов в минуту в фиксированном окне, вы можете столкнуться со случаем, когда ограничитель скорости разрешает 20 запросов в течение одноминутного интервала. Это может произойти, если первые 10 запросов находятся в левой части текущего окна, а следующие 10 запросов — в правой части окна, и оба имеют достаточно места в своих сегментах, чтобы их можно было пропустить. Если вы отправите те же 20 запросов через Sliding Window Rate Limiter, если все они будут отправлены в течение одной минуты, только 10 пройдут.
Как работает:
- Определение окна:
- Устанавливается временное окно, например, 1 минута.
- Определяется лимит запросов, например, 100 запросов в минуту.
- Скользящее окно:
- Вместо фиксированного окна (где подсчёт запросов сбрасывается по завершении каждого интервала), Sliding Window делит окно на более мелкие временные сегменты.
- Лимит учитывается не за последний полный интервал, а за последние N секунд/минут от текущего момента.
- Механизм подсчёта:
- Запросы фиксируются с отметкой времени (таймстемп) в хранилище (например, Redis).
- При новом запросе подсчитываются все запросы, совершённые в пределах текущего окна.
- Удаление старых запросов:
- Запросы, вышедшие за пределы текущего окна, удаляются из хранилища.
Алгоритм:
- При каждом запросе:
- Определить временное окно (например, последние 60 секунд).
- Удалить запросы, которые вышли за пределы окна.
- Подсчитать количество запросов в пределах окна.
- Если запросов меньше лимита:
- Разрешить выполнение.
- Добавить текущий запрос в хранилище.
- Если запросов больше или равно лимиту:
- Запрос отклоняется.