Прокси-сервер с 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 при лавинообразных отправках во время лабораторных и тестов. - Автоматическое выстраивание запросов, превышающих лимиты мощностей, во внутреннюю очередь.
- Отслеживание состояния всего кластера и каждого узла в отдельности в реальном времени.
- Изменение алгоритма планирования задач из интерфейса без перезапуска.
- Нагрузочное тестирование: симуляция нужного числа пользователей и суммарного потока задач.
- Подробные интерактивные метрики: задержка, средняя длительность выполнения, общее время прохождения комплексного теста, процент успешности выполнения.
Проект спроектирован лаконично и содержит:
/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 up -d --build
После успешной сборки и запуска:
- Панель управления будет доступна по адресу:
http://localhost:3000 - Прокси-сервер для Moodle будет принимать запросы по адресу:
http://localhost:3000/jobe/index.php/restapi/...
- 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.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"
}
]
}
Запуск по умолчанию.
- 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.
«Нагрузочное тестирование» на странице:
- Задайте общее количество тестов (например,
1000). - Задайте количество имитируемых одновременных пользователей (например,
50). - Нажмите «Запустить тест». Прокси обработает пачки задач в реальном времени, отразив их распределение по серверам, состояние очереди выполнения и среднее/общее время тестирования.
Запустите предустановленный асинхронный нагрузочный скрипт:
# Имитация 1000 запросов на проверку при одновременной работе 50 пользователей
python3 load_test.py 1000 50 smart_power code.pyload_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)