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

8 000 руб. за проект
06 февраля 2024, 19:17 • 2 отклика • 36 просмотров
Описание задачи:
Пользователь хочет считать арифметические выражения. Он вводит строку 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-ы:

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

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

В первую очередь необходимо разработать часть back-end.
Возможны отклонения от задания по согласованию.
Проект должен разворачиваться через Docker.
Возможно использование сторонних библиотек.
Срок 12.02.24

Отзывы
Avatar r50 a6ce93fe35b158fd29ba0e8681c918c22117160e9586a56eee4ffbc20df9bda1
Заказчик
Исполнитель выполнил сложный заказ в короткий срок.
На первом этапе проанализировал и скорректировал ТЗ.
На втором этапе полностью разработал функционал бэкенда и фронтенда с использованием современного стека технологий.
Написал документацию к проекту и объяснил его развернуть в рабочей среде.
10 месяцев назад
 
10 месяцев назад