Кейс · Бэкенд · Rust

rate-gate: ограничитель частоты запросов

HTTP-сервис на Rust: один вызов POST /v1/check отвечает, можно ли пропустить действие. Два алгоритма: токен-бакет на целочисленных милли-токенах (всплески) и скользящее окно по двум счётчикам (строгие лимиты). Правила в JSON, выбор по префиксу ключа, метрики Prometheus, снапшот состояния, страница-демо. Состояние в памяти одного экземпляра: реплики его не делят.

  • Rust
  • axum
  • tokio
  • proptest
  • musl
  • distroless
  • Prometheus
  • Docker
  • GitHub Actions

01 · Как выглядит

Скриншоты

Скриншот проекта «rate-gate: ограничитель частоты запросов» на экране 1280 пикселей
Десктоп, 1280 px
Скриншот проекта «rate-gate: ограничитель частоты запросов» на экране телефона, 390 пикселей
Телефон, 390 px

02 · О проекте

Что это и зачем

HTTP-сервис на Rust: один вызов POST /v1/check отвечает, можно ли пропустить действие. Два алгоритма: токен-бакет на целочисленных милли-токенах (всплески) и скользящее окно по двум счётчикам (строгие лимиты). Правила в JSON, выбор по префиксу ключа, метрики Prometheus, снапшот состояния, страница-демо. Состояние в памяти одного экземпляра: реплики его не делят.

Ограничения

Один экземпляр: состояние не разделяется между репликами.

Скользящее окно приближённое (взвешенная сумма двух окон).

Снапшот не транзакционный: при аварии теряется до 30 с счётчиков.

Проект работает на небольшом VPS с демо-данными: без отказоустойчивости и резервных копий.

Что внутри

  • Токен-бакет без float: милли-токены, cost больше 1, расчёт retry_after_ms и reset_ms
  • Property-тесты (proptest): за любой период бакет выдаёт не больше capacity + refill * elapsed
  • 20 тестов; образ 8,2 МБ, 3,8 МиБ RAM в покое и 3,9 МиБ после 200 запросов
  • Контейнер uid 10001, read-only, cap-drop ALL, CSP script-src 'self'

03 · Как запустить

Запуск одной командой

git clone <репозиторий по запросу> rate-gate
cd rate-gate
cargo run --release

04 · Код

Репозиторий приватный

Исходники лежат в приватном репозитории. Напишите в Telegram, открою доступ.

Запросить код