No description
  • TeX 64.2%
  • Rust 35.8%
Find a file
2026-05-03 22:26:25 +04:00
docs update simulation, visualization and thesis 2026-04-15 02:31:03 +04:00
src update simulation, visualization and thesis 2026-04-15 02:31:03 +04:00
tests publish src 2026-04-08 01:46:52 +04:00
thesis Fix thesis references and bibliography 2026-05-03 22:26:25 +04:00
.gitignore remove LaTeX build artifacts from git, add to .gitignore 2026-04-08 01:42:53 +04:00
Cargo.lock update simulation, visualization and thesis 2026-04-15 02:31:03 +04:00
Cargo.toml update simulation, visualization and thesis 2026-04-15 02:31:03 +04:00
gost.sty update simulation, visualization and thesis 2026-04-15 02:31:03 +04:00
README.md initial commit 2026-04-08 01:38:32 +04:00

ECS Distributed System Simulator

Дипломный проект по теме «Архитектура ECS для моделирования распределённых систем». Репозиторий содержит интерактивный симулятор отказоустойчивого распределённого key-value кластера на Rust + Bevy 0.18.1, а также текст автореферата и сопроводительную документацию.

Что моделируется

Симулятор показывает упрощённый, но предметно осмысленный кластер, в котором есть:

  • клиенты, генерирующие GET, PUT и DELETE;
  • маршрутизаторы запросов;
  • узлы хранения со состояниями Alive, Slow, Partitioned, Failed, Recovering;
  • шардирование пространства ключей;
  • leader/follower-реплики с фактором репликации;
  • сообщения в полёте, heartbeat и timeout-механика;
  • задержки сети, деградация каналов, потери сообщений и partition-сценарии;
  • очереди обработки на узлах;
  • упрощённое переизбрание лидера;
  • панель метрик в реальном времени.

Это не реализация реальной СУБД и не протокол уровня Raft. Цель проекта — исследовать поведение распределённой системы и показать, что ECS-подход хорошо подходит для моделирования большого числа взаимодействующих сущностей.

Почему ECS

В модели много однотипных и слабо связанных объектов: узлы, реплики, сообщения, каналы, таймеры, клиенты, визуальные представления. ECS позволяет:

  • хранить состояние как композицию независимых компонентов;
  • разбить поведение на короткие системы: генерация запросов, доставка сообщений, heartbeat, обработка очередей, сбор метрик, визуальное обновление;
  • отделить доменную модель от UI и визуализации;
  • расширять сценарии без переписывания монолитного объекта «кластера».

Возможности приложения

  • 2D-визуализация кластера, состояний узлов, каналов и сообщений.
  • Запуск, пауза, пошаговое выполнение и сброс симуляции.
  • Настройка числа клиентов, узлов, шардов, replication factor, интенсивности нагрузки, таймаутов и сетевых параметров.
  • Preset-сценарии: Normal Operation, High Load, Leader Failure, Multi Node Failure, Network Partition, Recovery.
  • Интерактивные воздействия:
    • клик по узлу переводит его в сбой или восстановление;
    • в панели управления можно выделить шард;
    • можно деградировать или отключать связь между двумя выбранными узлами;
    • можно скрывать или показывать сообщения в полёте.
  • Метрики:
    • throughput;
    • средняя и p95 latency;
    • timeouts;
    • потерянные сообщения;
    • число смен лидера;
    • длины очередей;
    • загрузка узлов;
    • replica lag;
    • доля успешных чтений и записей.

Ограничения модели

  • Используется дискретное модельное время, а не реальные сокеты и потоки.
  • Выбор лидера упрощён и детерминирован.
  • Репликация лидерная и quorum-like, без полного консенсусного протокола.
  • GET может выполняться либо через лидера, либо через выбранную реплику в режиме PreferReplica.
  • Сценарии отказов заданы как исследовательские эксперименты, а не как точная эмуляция продакшн-кластера.

Сборка и запуск

Требования:

  • стабильный Rust;
  • системные зависимости для winit/wgpu под вашу платформу.

Команды:

cargo fmt
cargo clippy --all-targets --all-features -- -D warnings
cargo test
cargo run

Как работать с приложением

  • Левая панель: управление симуляцией, выбор сценария, параметры модели и интерактивные действия.
  • Правая панель: метрики и инспектор выделенного узла/шарда.
  • Клик по узлу на сцене:
    • живой узел переводится в Failed;
    • Failed или Partitioned узел переводится в Recovering.
  • Выделение шарда подсвечивает его реплики на узлах.

Структура репозитория

  • src/app/ — сборка приложения и headless-конфигурация для тестов.
  • src/domain/ — чистая предметная логика: шардирование, выбор лидера, percentiles и базовые типы.
  • src/simulation/ — компоненты, ресурсы, сообщения, системы и плагины симуляционного ядра.
  • src/visualization/ — 2D-сцена, визуальные сущности, отрисовка связей и клики по узлам.
  • src/ui/ — панели управления и метрик на bevy_egui.
  • docs/ — описание модели и её соответствия ECS-структуре.
  • thesis/abstract/ — LaTeX-автореферат.

Документация