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

flag-store: фича-флаги с процентным rollout

Сервис фича-флагов на Rust: флаги по окружениям, правила по атрибутам пользователя, процентный rollout без случайности, журнал аудита и SSE-поток изменений. Корзина пользователя это первые 8 байт SHA-256 от флага и id по модулю 10000, поэтому ответ стабилен, а рост процента никого не выключает. Доли в базисных пунктах, float нигде нет.

  • Rust
  • axum
  • tokio
  • SQLite
  • SSE
  • SHA-256
  • proptest
  • musl
  • distroless
  • Docker
  • GitHub Actions

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

Скриншоты

Скриншот проекта «flag-store: фича-флаги с процентным rollout» на экране 1280 пикселей
Десктоп, 1280 px
Скриншот проекта «flag-store: фича-флаги с процентным rollout» на экране телефона, 390 пикселей
Телефон, 390 px

02 · О проекте

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

Сервис фича-флагов на Rust: флаги по окружениям, правила по атрибутам пользователя, процентный rollout без случайности, журнал аудита и SSE-поток изменений. Корзина пользователя это первые 8 байт SHA-256 от флага и id по модулю 10000, поэтому ответ стабилен, а рост процента никого не выключает. Доли в базисных пунктах, float нигде нет.

Ограничения

Чтение и evaluate открыты: закрывать их нужно на уровне прокси.

SQLite с одним соединением под мьютексом: горизонтально не масштабируется.

Сборка и тесты выполнялись в контейнере rust:1-alpine, на ПК cargo не ставился.

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

Что внутри

  • Детерминированный rollout: SHA-256(флаг, id) по модулю 10000; один пользователь всегда получает один ответ
  • 3 property-теста: стабильность, монотонность по проценту, равномерность на 20 000 пользователей с допуском 2 п.п.
  • 15 тестов; образ 11,6 МБ, 2,7 МиБ RAM в покое и 3,5 МиБ после 200 evaluate
  • SSE-поток изменений с hello, change и resync; журнал аудита с автором и состоянием до и после

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

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

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

04 · Код

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

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

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