Кейс · Бэкенд · Rust
rate-gate: ограничитель частоты запросов
HTTP-сервис на Rust: один вызов POST /v1/check отвечает, можно ли пропустить действие. Два алгоритма: токен-бакет на целочисленных милли-токенах (всплески) и скользящее окно по двум счётчикам (строгие лимиты). Правила в JSON, выбор по префиксу ключа, метрики Prometheus, снапшот состояния, страница-демо. Состояние в памяти одного экземпляра: реплики его не делят.
- Rust
- axum
- tokio
- proptest
- musl
- distroless
- Prometheus
- Docker
- GitHub Actions
01 · Как выглядит
Скриншоты


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 --release04 · Код
Репозиторий приватный
Исходники лежат в приватном репозитории. Напишите в Telegram, открою доступ.
Запросить код