Задача: написать серверное приложение (aka микросервис) Balancer.
Балансер умеет:
· принимать запрос на размещение процесса
· принимать запрос на удаление процесса
· принимать запрос на добавление work-машины
· принимать запрос на удаление work-машины
· распределять процессы между work-машинами, обеспечивая равномерную нагрузку, выполняя ребалансировку в случае добавления или удаления машин/процессов.
После размещения процесс работает вечно, пока не будет удален запросом на удаление.
Процесс характеризуется необходимым кол-вом процессора и памяти.
Машина характеризуется: процессором и памятью. Одно ядро берем за 100, если у машины 6 ядер, считаем для простоты, что её процессор - 600.
Покрытие тестами опционально, но приветствуется.
Список технологий к использованию: PHP 7+ Symfony Mysql / Redis или любого иного персистентного хранилища.
Задание необходимо выполнить с учетом MVC паттерна, принципов SOLID, DRY.
Реализован как API (рест?)
Балансировщик принимает запросы на удаление/добавление машины/процесса и возвращает ответ в формате JSON.
В случае запроса на добавление процесса сервер находит минимально загруженную машину и добавляет процесс в нее (связывает новый процесс и существующую машину в бд)
В случае запроса на удаления процесса он просто удаляется
В случае запроса на добавление машины ребалансировка существующих процессов не производится т.к. это подразумевает необходимость удаления как минимум части запросов и их последующего добавления (могу легко реализовать, но это малоэффективно)
В случае запроса на удаление машины ребалансировка выполняется (необходимо перенести активные процессы с нее на другие машины)
Добавлены исключения к ответам и их логгирование
Добавлены тесты (юнит, интеграционные, функциональные)
Использован PHP 8.1, PostgreSQL 14, Symfony 6
$ composer install
$ docker-compose -f docker-compose.yaml up -d
connect to db
$ symfony var:export --multiline > .env.local
$ php bin/console make:migration
$ php bin/console doctrine:migrations:migrate
$ php bin/console doctrine:fixtures:load --purge-with-truncate