Данный проект был создан как итоговый проект курса Yandex по программированию на Go
Этот проект реализует распределённую систему вычисления арифметических выражений. Система состоит из двух компонентов:
- Оркестратор: Сервер, который принимает арифметические выражения, разбивает их на задачи с помощью постфиксной нотации и закидывает в очередь на выполнение а также создающее канал для получения результатов
- Агент: Демон, который получает задачи от оркестратора, выполняет их с задержкой, переданной оркестратором и возвращает результаты обратно.
Помимо этого в оркестраторе реализовано кеширование, позволяющее ускорить вычисления
- Docker
- Docker Compose
- Скачайте и установите Docker Desktop для Windows.
- Убедитесь, что Docker Desktop установлен и работает.
- Docker Compose включён в состав Docker Desktop, отдельной установки не требуется.
- Скачайте и установите Docker Desktop для Mac.
- Убедитесь, что Docker Desktop установлен и работает.
- Docker Compose включён в состав Docker Desktop, отдельной установки не требуется.
- Следуйте инструкциям по установке Docker для вашей версии дистрибутива здесь.
- Следуйте инструкциям по установке Docker Compose здесь.
ВАЖНО: Недавно докер прижали американцы со своими санкциями и теперь у россиян возникает соответствующая ошибка при скачивании контейнеров с Dockerhub
-
Перейти в настройки (шестеренка вверху)
-
Перейти во вкладку Docker Engine
-
Добавить параметр
"registry-mirrors": ["https://dockerhub.timeweb.cloud"]в конфигПример моего конфига:
{ "builder": { "gc": { "defaultKeepStorage": "20GB", "enabled": true } }, "experimental": false, "registry-mirrors": [ "https://dockerhub.timeweb.cloud" ] }
Следуйте инструкциям по изменению конфига на сайте самой прокси, изменения конфига аналогичны примеру выше
-
Клонируйте репозиторий в нужную вам папку:
git clone https://github.com/rem-aster/distributed-calc-test cd distributed-calc-test -
Убедитесь, что Docker и Docker Compose установлены и работают на вашей машине.
-
Отредактируйте переменные окружения в скрипте
run.shилиrun.ps1, если это необходимо:Для Windows (run.ps1):
$env:ORCH_URL = "http://orch:8080/internal/task" $env:COMPUTING_POWER = 3 #можно редактировать это $env:TIME_ADDITION_MS = 10 #это $env:TIME_SUBTRACTION_MS = 10 #это $env:TIME_MULTIPLICATION_MS = 10 #это $env:TIME_DIVISION_MS = 10 #и это число docker-compose up --build --remove-orphans
Для MacOS и Linux (run.sh):
export ORCH_URL="http://orch:8080/internal/task" export COMPUTING_POWER=3 #можно редактировать переменные аналогично примеру выше (run.ps1) export TIME_ADDITION_MS=10 export TIME_SUBTRACTION_MS=10 export TIME_MULTIPLICATION_MS=10 export TIME_DIVISION_MS=10 docker-compose up --build --remove-orphans
-
Для Windows:
Откройте PowerShell и перейдите в директорию с репозиторием:
cd путь/к/папке/distributed-calc-test
Убедитесь, что у вас есть права на выполнение PowerShell скриптов. Для этого выполните следующую команду в PowerShell с правами администратора:
Set-ExecutionPolicy RemoteSignedЗапустите скрипт
run.ps1:.\run.ps1
Для MacOS и Linux:
Откройте терминал и перейдите в директорию с вашим проектом:
cd путь/к/папке/distributed-calc-testЗапустите скрипт
run.sh:./run.sh
После успешного развертывания смело открываем новую вкладку консоли (powershell в Windows или bash в Linux/MacOS) и курлим как в примерах ниже
Переменные окружения, используемые в проекте, изменения которых вступят в силу только после старта/рестарта:
COMPUTING_POWER: Количество горутин, используемых агентом для выполнения задач.TIME_ADDITION_MS: Время выполнения операции сложения в миллисекундах.TIME_SUBTRACTION_MS: Время выполнения операции вычитания в миллисекундах.TIME_MULTIPLICATION_MS: Время выполнения операции умножения в миллисекундах.TIME_DIVISION_MS: Время выполнения операции деления в миллисекундах.
-
Добавление выражения для вычисления: Пример для Linux/MacOS:
curl --header 'Content-Type: application/json' --data '{"expression": "2 + 2 * 2"}' localhost:8080/api/v1/calculate
Пример для Windows:
Invoke-RestMethod -Uri "http://localhost:8080/api/v1/calculate" -Method POST -Headers @{"Content-Type" = "application/json"} -Body '{"expression": "2 + 2 * 2"}'
Вместо 2 + 2 * 2 подставляем нужное для вычисления арифметическое выражение
ВАЖНО В выражении могут быть только неотрицательные целочисленные или дробные (например 2.2) числа, символы операций (+-*/) и скобки
В ответ будет получен id вычисления
-
Получение всего списка выражений: Пример для Linux/MacOS:
curl http://localhost:8080/api/v1/expressions
Пример для Windows:
Invoke-WebRequest -Uri "http://localhost:8080/api/v1/expressions" -Method Get
В ответ будет получен список всех вычислений, их статусы и результаты
-
Получение выражения по его идентификатору: Пример для Linux/MacOS:
curl http://localhost:8080/api/v1/expressions/1
Пример для Windows:
Invoke-WebRequest -Uri "http://localhost:8080/api/v1/expressions/1" -Method Get
Вместо 1 нужно написать id выражения
В ответ будет получен id, статус и результат указанного вычисления
После выполнения указанных шагов система будет запущена и готова к использованию. Вы можете добавлять арифметические выражения, получать их статус и результаты.