calc-yandex-lyceum

module
v0.0.0-...-4592d6e Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 20, 2024 License: GPL-3.0

README

https://t.me/solopenkovdmitriy

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

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

GUI, который можно представить как 4 страницы

    Форма ввода арифметического выражения. Пользователь вводит арифметическое выражение и отправляет POST http-запрос с этим выражением на back-end. Примечание: Запросы должны быть идемпотентными. К запросам добавляется уникальный идентификатор. Если пользователь отправляет запрос с идентификатором, который уже отправлялся и был принят к обработке - ответ 200. Возможные варианты ответа:
        200. Выражение успешно принято, распаршено и принято к обработке
        400. Выражение невалидно
        500. Что-то не так на back-end. В качестве ответа нужно возвращать id принятного к выполнению выражения.
    Страница со списком выражений в виде списка с выражениями. Каждая запись на странице содержит статус, выражение, дату его создания и дату заверщения вычисления. Страница получает данные GET http-запрсом с back-end-а
    Страница со списком операций в виде пар: имя операции + время его выполнения (доступное для редактирования поле). Как уже оговаривалось в условии задачи, наши операции выполняются "как будто бы очень долго". Страница получает данные GET http-запрсом с back-end-а. Пользователь может настроить время выполения операции и сохранить изменения.
    Страница со списком вычислительных можностей. Страница получает данные GET http-запросом с сервера в виде пар: имя вычислительного ресурса + выполняемая на нём операция.

    Требования:
    Оркестратор может перезапускаться без потери состояния. Все выражения храним в СУБД.
    Оркестратор должен отслеживать задачи, которые выполняются слишком долго (вычислитель тоже может уйти со связи) и делать их повторно доступными для вычислений.


Back-end часть

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

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

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

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


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

Запуск приложения

На ПК должен быть установлен docker актуальной версии.

Запуск в фоновом режиме

git clone https://github.com/DmitriySolopenkov/calc-yandex-lyceum.git
cd calc-yandex-lyceum
docker-compose build
docker-compose up -d

Запуск в режиме отладки

git clone https://github.com/DmitriySolopenkov/calc-yandex-lyceum.git
cd calc-yandex-lyceum
docker-compose up --build

Swagger

Страница доступа swagger

Примеры сопросов

Добавить задание

curl -X 'POST' \
  'http://localhost:8080/' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "add_time": "1",
  "dev_time": "1",
  "mult_time": "1",
  "sub_time": "1",
  "task": "1+6*2"
}'

Результат

{
  "err": null,
  "data": {
    "reqID": "e892e52814fcedb6728aa38d7a52b1ca7aa4f37657db1e5a70d945b7c9ba77a4"
  },
  "info": ""
}

Получить задание по id

curl -X 'GET' \
  'http://localhost:8080/task/e892e52814fcedb6728aa38d7a52b1ca7aa4f37657db1e5a70d945b7c9ba77a4' \
  -H 'accept: application/json'

Результат

{
  "err": null,
  "data": {
    "CreatedAt": "2024-02-18T17:39:51.036561Z",
    "DeletedAt": null,
    "Err": "",
    "Expression": "1+6*2",
    "ID": 1,
    "Req_id": "e892e52814fcedb6728aa38d7a52b1ca7aa4f37657db1e5a70d945b7c9ba77a4",
    "Res": "13",
    "Status": true,
    "ToDoTime": 2,
    "UpdatedAt": "2024-02-18T17:39:57.057875Z"
  },
  "info": ""
}

Получить все задания

curl -X 'GET' \
  'http://localhost:8080/tasks' \
  -H 'accept: application/json'

Результат

{
  "err": null,
  "data": [
    {
      "CreatedAt": "2024-02-18T17:39:51.036561Z",
      "DeletedAt": null,
      "Err": "",
      "Expression": "1+6*2",
      "ID": 1,
      "Req_id": "e892e52814fcedb6728aa38d7a52b1ca7aa4f37657db1e5a70d945b7c9ba77a4",
      "Res": "13",
      "Status": true,
      "ToDoTime": 2,
      "UpdatedAt": "2024-02-18T17:39:57.057875Z"
    }
  ],
  "info": ""
}

ToDo

  • Настроить CI
  • Вынести таймера в отдельную таблицу
  • Добавить увеличение реплик агента
  • get-запрос на состояние агентов

Directories

Path Synopsis
cmd
internal
orchestrator/schema/schema
Package schema Code generated by swaggo/swag.
Package schema Code generated by swaggo/swag.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL