Skip to content

moevm/coderunner_proxy

Repository files navigation

CodeRunner Proxy

Прокси-сервер с web-панелью управления для масштабирования и мониторинга серверов тестирования кода Jobe, используемых в системах автоматической проверки задач Moodle (CodeRunner).

Проект позволяет объединить несколько независимых серверов Jobe и распределять нагрузку между ними на основе сложности распределяемого кода, автоматически регулировать очередь выполнения задач и проводить нагрузочное тестирование.


Основные возможности

Режимы распределения задач

  • Классический Round-Robin: Равномерное поочередное распределение задач между всеми серверами.
  • Взвешенный Round-Robin (Weighted RR): Циклически направляет задачи с приоритетом на более производительные сервера (Высокопроизводительные-узлы обрабатывают до 3 раз больше задач, чем низкопроизводительные-узлы).
  • Улучшенный взвешенный Round-Robin(Smart Power - по умолчанию): Производит быстрый синтаксический анализ проверяемого кода, выявляя ресурсоемкие участки (циклы, условия, сложные структуры, библиотеки), классифицирует сложность (Low, Medium, High) и отправляет задачу на сервер с соответствующей мощностью.
  • По наименьшей нагрузке (Least Active): Направляет задачу на узел с наименьшим количеством активных процессов в реальном времени.

Управление глобальной очередью

  • Ограничение максимальной конкурентности (MAX_CONCURRENT_RUNS) системным семафором, предотвращающее перегрузку серверов Jobe при лавинообразных отправках во время лабораторных и тестов.
  • Автоматическое выстраивание запросов, превышающих лимиты мощностей, во внутреннюю очередь.

Web-интерфейс

  • Отслеживание состояния всего кластера и каждого узла в отдельности в реальном времени.
  • Изменение алгоритма планирования задач из интерфейса без перезапуска.
  • Нагрузочное тестирование: симуляция нужного числа пользователей и суммарного потока задач.
  • Подробные интерактивные метрики: задержка, средняя длительность выполнения, общее время прохождения комплексного теста, процент успешности выполнения.

Описание структуры файлов проекта

Проект спроектирован лаконично и содержит:

  • /server.py — Основной бэкенд на FastAPI. Выступает в роли прокси, реализует балансировку, анализ кода и ведение семафорной очереди задач.
  • /src/ — Фронтенд-приложение на React с использованием Material UI и Vite:   - src/App.tsx — Содержание страницы, нагрузочного тестирования и панели управления.   - src/index.css & src/main.tsx — Настройки стилей и точка монтирования приложения.
  • /nodes.json — Конфигурационный файл, где описываются Jobe-сервера, их сетевые адреса, поддерживаемые компиляторы и условная "мощность" (Low, Medium, High). Пример файла ниже.
  • /docker-compose.yml & /Dockerfile — Готовая конфигурация для развертывания системы. Поднимает прокси, три контейнера Jobe (с установленными лимитами на ресурсы) и NoSQL СУБД MongoDB для логирования.
  • /load_test.py — Python-скрипт для симуляции параллельных асинхронных нагрузочных тестов из терминала (поддерживает аргументы для настройки, подробнее ниже).
  • /init-moodle.sh — Вспомогательный скрипт автоматизированной инициализации Moodle окружения при локальном развертывании для минимальной настройки.
  • package.json, tsconfig.json, vite.config.ts — Конфигурации сборки веб-интерфейса и TypeScript-типизации.
  • requirements.txt — Список необходимых библиотек для стабильной работы Python.

Быстрый старт через Docker Compose

Для запуска:

docker-compose up -d --build

После успешной сборки и запуска:

  • Панель управления будет доступна по адресу: http://localhost:3000
  • Прокси-сервер для Moodle будет принимать запросы по адресу: http://localhost:3000/jobe/index.php/restapi/...

ENV

  • LOGS_MAX_SIZE_MB - ограничение размера бд для логов.
  • MONGO_URI - ссылка на бд.
  • JOBE_SERVERS - ссылки на узлы для проверки кода с установленным jobe. Необходимы при сборке контейнера.
  • MAX_CONCURRENT_RUNS - максимальное число одновременных пользователей.
  • DEFAULT_SCHEDULING_ALGORITHM - алгоритм для распределения трафика по умолчанию.
  • PROXY_PORT - порт прокси.
  • HEAVY_LIBRARIES - список тяжёлых библиотек.
  • IF_STATS - 1, если требуется запись метрик в файл proxy_metrics.json, 0, если не требуется.

Nodes

Файл nodes.json содержит текущую конфигурацию кластера. После запуска контейнера прокси, при его заполнении, подтягивает данные. Через этот файл можно редактировать настройки кластера без перезапуска контейнера.

Пример файла:

{
  "nodes": [
    {
      "url": "http://jobe1:80",
      "name": "Jobe Node 1",
      "languages": ["python3", "c", "cpp"],
      "power": "High"
    },
    {
      "url": "http://jobe2:80",
      "name": "Jobe Node 2",
      "languages": ["python3", "java", "nodejs"],
      "power": "Medium"
    },
    {
      "url": "http://jobe3:80",
      "name": "Jobe Node 3",
      "languages": ["python3", "java", "nodejs"],
      "power": "Low"
    }
  ]
}

Интеграция с Moodle (CodeRunner)

Запуск по умолчанию.

  • Admin login: admin
  • Admin password: AdminPassword123!

Для перенаправления потоков выполнения тестов на созданный высокопроизводительный кластер, укажите следующие параметры в настройках плагина CodeRunner Moodle:

  • Jobe Server: proxy:3000

Так же необходимо открыть порт и IP. В HTTP security измените поля:

  • cURL blocked hosts list: убрать 172.16.0.0/12
  • cURL allowed portss list: добавить 3000

Примечание: Прокси самостоятельно обрабатывает маршрутизацию, следит за целостностью заголовков API, запрашивает список доступных языков и прозрачно распределяет выполнение кода по инстансам Jobe.


Нагрузочное тестирование

Из браузера (проверка работоспособности узлов)

«Нагрузочное тестирование» на странице:

  1. Задайте общее количество тестов (например, 1000).
  2. Задайте количество имитируемых одновременных пользователей (например, 50).
  3. Нажмите «Запустить тест». Прокси обработает пачки задач в реальном времени, отразив их распределение по серверам, состояние очереди выполнения и среднее/общее время тестирования.

Из терминала

Запустите предустановленный асинхронный нагрузочный скрипт:

# Имитация 1000 запросов на проверку при одновременной работе 50 пользователей
python3 load_test.py 1000 50 smart_power code.py

load_test.py число_запросов число_пользователей алгоритм дополнительный_файл

алгоритм - least_active/round_robin/weighted_round_robin/smart_power дополнительный_файл - скрипт допускает добавление своего кода в пул задач. Задача автоматически определяется, как тяжёлая. Функция необходима для проверки работоспособности прокси при проверке курсовых и других реальных работ студентов.

Скрипт выведет детальную метрику, показатели пропускной способности (Задачи/сек) и лог ошибок.

Тест выводит результаты запросов в формате: . - успех, R - успех после повторного запроса к узлу, F - провал.

Пример вывода:

......................................................
=== Потребление ресурсов прокси ===
Средняя нагрузка CPU:   59.18%
Средняя память RSS:    63.16 MB
LOAD TEST FINAL RESULTS
Общее время теста:    30.86 сек
Пропускная способность: 32.41 запр/сек

Метрика задержки      |  Среднее время (ms)
Полный цикл (RTT)     |      308.02 ms
Обработка сервером    |      249.27 ms (Proxy + Jobe)
Сеть и ожидание       |       58.27 ms (Client -> Server -> Client)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors