Skip to content

DECS-1.01

Latest

Choose a tag to compare

@KFN002 KFN002 released this 18 Feb 18:41
· 40 commits to main since this release

Distributed Expression Calculation System


Задача:

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


"Стартуем, я сказала стартуем!"

Быстрый запуск: Запустите файл backend/cmd/app/main.go - все должно работать

!Перед запуском убедитесь, что у вас последняя версия!


Что теперь?

  • Куда идти потом? http://localhost:8080/

  • Навигация на страницах имеет говорящие названия:

    • Create Expression - создание выражения: Пользовательский ввод арифметического выражения -> ID и статус задачи.
    • Expressions - таблица со всеми выражениями из БД с колонками: ID, Status, Expression, Result, Creation Date, Completion Date.
    • Expression by ID - получение данных о задаче по ID: Пользовательский ввод числа -> данные о задаче. Если ID больше, чем есть задач, то будет ошибка (failed to fetch an expression).
    • Edit Time - Изменение времени выполнения операций: Пользовательский ввод числа/чисел -> изменение времени выполнения операций.
    • Server Data - Данные о воркерах (серверах/горутинах): ID "сервера", статус, задание, которое выполняет, последний ответ на запрос о состоянии.
    • Project Scheme- Схема проекта
  • В целом можно не тестить, все работает, да и я постарался)

  • Если будет проблема с gcc, надо будет его установить и добавить в переменные окружения:

  • Ссылки сверху точно должны помочь в фиксе проблемы.


Как все устроено?

  1. backend - весь бэк по модулям
  2. static - весь фронт:
    • assets - .html templates и .css файлы.

Поподробнее, но не слишком:

  1. dataManager - internal
    • librarian.go - отвечает за работу с базой данных, то есть там находятся все функции для получения/изменения данных в базе.
  2. orchestratorAndAgent
    • orchestratorAndAgent.go - занимается получением ответа на выражение: получает выражение через очередь от оркестратора и распределяет его на мелкие таски, считает, а после собирает весь ответ и закидывает в базу данных.
  3. handlers
    • handlers.go - обработка запросов пользователя: получение всех выражений, получение выражения по id, изменение времени работы операции и т.д.
  4. models - pkg
    • expression - структура выражения.
    • operations - структура числовых операций: время их выполнения.
    • serversData - структура и пара функций для серверов (горутин) - их состояния, таски. В этом же файле можно масштабироваться (менять переменную - количество серверов (горутин)).
    • stack - стек с методами.
  5. cmd
    • main.go (app) - запуск сервера, раньше там же был и файл handlers, но разумнее оказалось его закинуть в отдельный модуль.
  6. tests
    • test.go - тесты, созданные для первых версий сервера, скорее всего файл будет пустым.
  7. utils - internal
    • utils.go - вспомогательные функции, в основном проверка корректности выражения.
  8. cacheMaster - internal
    • cacheMaster.go - кэш для хранения времени операций, чтобы часто не обращаться к базе данных. Удобно, так как время операций назначает пользователь (само не меняется).
  9. queueMaster - internal
    • queueMaster.go - реализация очереди.
  10. calculator - internal
    • calculator.go - расчет простых выражений.
    • changeNotation.go - изменение нотации выражения.

Схема работы - на сайте


Примеры для ввода в поле выражения:

  1. 2+2
  2. 3+4
  3. 3*8
  4. 7/7
  5. 3-2
  6. 2-3
  7. 6/9
  8. 6/0
  9. 7**2
  10. ((2-1)))
  11. 2+2*2
  12. (3-4/2)
  13. 17/(2-2)
  14. 11-4*(3+5)
  15. 81+12*(11+1)

TG: @RR7B7