Categorygithub.com/katenester/Distributed_computing
module
0.0.0-20241030165241-5da8d086c235
Repository: https://github.com/katenester/distributed_computing.git
Documentation: pkg.go.dev

# README

Распределенный вычислитель арифметических выражений

Задание

Пользователь хочет считать арифметические выражения. Он вводит строку 2 + 2 * 2 и хочет получить в ответ 6. Но наши операции сложения и умножения (также деления и вычитания) выполняются "очень-очень" долго. Поэтому вариант, при котором пользователь делает http-запрос и получает в качетсве ответа результат, невозможна. Более того: вычисление каждой такой операции в нашей "альтернативной реальности" занимает "гигантские" вычислительные мощности. Соответственно, каждое действие мы должны уметь выполнять отдельно и масштабировать эту систему можем добавлением вычислительных мощностей в нашу систему в виде новых "машин". Поэтому пользователь, присылая выражение, получает в ответ идентификатор выражения и может с какой-то периодичностью уточнять у сервера "не посчиталость ли выражение"? Если выражение наконец будет вычислено - то он получит результат. Помните, что некоторые части арфиметического выражения можно вычислять параллельно.

Back-end часть

Состоит из 2 элементов:

  • Сервер, который принимает арифметическое выражение, переводит его в набор последовательных задач и обеспечивает порядок их выполнения. Далее будем называть его оркестратором.
  • Вычислитель, который может получить от оркестратора задачу, выполнить его и вернуть серверу результат. Далее будем называть его агентом.

Оркестратор

Сервер, который имеет следующие endpoint-ы:

  • Добавление вычисления арифметического выражения.
  • Получение значения выражения по его идентификатору.
  • Получение списка всех выражений.
  • Получение задачи для выполнения.
  • Приём результата обработки данных.

Агент

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

Инструкция к запуску:

  1. Склонировать проект или скачать git clone https://github.com/katenester/Distributed_computing
  2. В корневой директории 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

Инструкция к запуску:

  1. Скачать программу Postman https://www.postman.com/downloads/
  2. Скачать файл со всеми тестами, который покрывает разные сценарии: всё хорошо, ошибки. Импортировать его в 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

Схема Backend P.S. Сервер принимает выражение, проверяет его на корректность, переводит в обратную польскую запись, составляет задачи для агента. Также он отдаёт все выражения или выражение по его id, которое выдается клиенту после добавления. Демон запускает агентов в горутинах. Агент все время приходит к оркестратору с запросом по gRPC "дай задачку поработать" (в ручку GiveTask для получения задач). Оркестратор отдаёт задачу. Агент производит вычисление и в ручку оркестратора (GetResult для приёма результатов обработки данных) отдаёт результат.

# Packages

No description provided by the author
No description provided by the author