# README
Распределенный вычислитель арифметических выражений
Задание
Пользователь хочет считать арифметические выражения.
Он вводит строку 2 + 2 * 2
и хочет получить в ответ 6
.
Но наши операции сложения и умножения (также деления и вычитания) выполняются "очень-очень" долго.
Поэтому вариант, при котором пользователь делает http-запрос и получает в качетсве ответа результат, невозможна.
Более того: вычисление каждой такой операции в нашей "альтернативной реальности" занимает "гигантские" вычислительные мощности.
Соответственно, каждое действие мы должны уметь выполнять отдельно и масштабировать эту систему можем добавлением вычислительных мощностей в нашу систему в виде новых "машин".
Поэтому пользователь, присылая выражение, получает в ответ идентификатор выражения и может с какой-то периодичностью уточнять у сервера "не посчиталость ли выражение"?
Если выражение наконец будет вычислено - то он получит результат.
Помните, что некоторые части арфиметического выражения можно вычислять параллельно.
Back-end часть
Состоит из 2 элементов:
- Сервер, который принимает арифметическое выражение, переводит его в набор последовательных задач и обеспечивает порядок их выполнения. Далее будем называть его оркестратором.
- Вычислитель, который может получить от оркестратора задачу, выполнить его и вернуть серверу результат. Далее будем называть его агентом.
Оркестратор
Сервер, который имеет следующие endpoint-ы:
- Добавление вычисления арифметического выражения.
- Получение значения выражения по его идентификатору.
- Получение списка всех выражений.
- Получение задачи для выполнения.
- Приём результата обработки данных.
Агент
Демон, который получает выражение для вычисления с сервера, вычисляет его и отправляет на сервер результат выражения. При старте демон запускает несколько горутин, каждая из которых выступает в роли независимого вычислителя. Количество горутин регулируется переменной среды.
Инструкция к запуску:
- Склонировать проект или скачать
git clone https://github.com/katenester/Distributed_computing
- В корневой директории
docker-compose up
либоmake run
Тестирование:
Примеры использования с помощью curl
Удобнее всего тестировать работу из Postman(пункт ниже), но также приведены описания примеры запросов через curlДобавить выражения (POST)
curl --location 'http://localhost:8080/api/v1/calculate' \
--header 'Content-Type: application/json' \
--data '{
"expression": "2.5+2*(-2)"
}'
Получить список выражений (GET)
curl --location 'http://localhost:8080/api/v1/expressions'
Получить выражение по его id (GET)
curl --location 'http://localhost:8080/api/v1/expressions/1717341632116157400'
Postman
Инструкция к запуску:
- Скачать программу Postman https://www.postman.com/downloads/
- Скачать файл со всеми тестами, который покрывает разные сценарии: всё хорошо, ошибки. Импортировать его в Postman.
Файл: Postman
Запросы тестировались через Postman
Добавить выражения (POST)
http://localhost:8080/api/v1/calculate
{
"expression": "2.5+2*(-2)"
}
Получить список выражений (GET)
http://localhost:8080/api/v1/expressions
Получить выражение по его id
http://localhost:8080/api/v1/expressions/1717341632116157400
P/S/ id генерируется на сервере и возвращается в методе Добавить выражения (POST)
id задачи можно было получить из метода GET
Результаты вычислений
Схема работы Backend
P.S.
Сервер принимает выражение, проверяет его на корректность, переводит в обратную польскую запись, составляет задачи для агента. Также он отдаёт все выражения или выражение по его id, которое выдается клиенту после добавления.
Демон запускает агентов в горутинах. Агент все время приходит к оркестратору с запросом по gRPC "дай задачку поработать" (в ручку GiveTask для получения задач). Оркестратор отдаёт задачу.
Агент производит вычисление и в ручку оркестратора (GetResult для приёма результатов обработки данных) отдаёт результат.