Repository navigation
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, надо будет его установить и добавить в переменные окружения: -
Ссылки сверху точно должны помочь в фиксе проблемы.
Как все устроено?
backend- весь бэк по модулямstatic- весь фронт:assets- .html templates и .css файлы.
Поподробнее, но не слишком:
dataManager- internallibrarian.go- отвечает за работу с базой данных, то есть там находятся все функции для получения/изменения данных в базе.
orchestratorAndAgentorchestratorAndAgent.go- занимается получением ответа на выражение: получает выражение через очередь от оркестратора и распределяет его на мелкие таски, считает, а после собирает весь ответ и закидывает в базу данных.
handlershandlers.go- обработка запросов пользователя: получение всех выражений, получение выражения по id, изменение времени работы операции и т.д.
models- pkgexpression- структура выражения.operations- структура числовых операций: время их выполнения.serversData- структура и пара функций для серверов (горутин) - их состояния, таски. В этом же файле можно масштабироваться (менять переменную - количество серверов (горутин)).stack- стек с методами.
cmdmain.go(app) - запуск сервера, раньше там же был и файл handlers, но разумнее оказалось его закинуть в отдельный модуль.
teststest.go- тесты, созданные для первых версий сервера, скорее всего файл будет пустым.
utils- internalutils.go- вспомогательные функции, в основном проверка корректности выражения.
cacheMaster- internalcacheMaster.go- кэш для хранения времени операций, чтобы часто не обращаться к базе данных. Удобно, так как время операций назначает пользователь (само не меняется).
queueMaster- internalqueueMaster.go- реализация очереди.
calculator- internalcalculator.go- расчет простых выражений.changeNotation.go- изменение нотации выражения.
Схема работы - на сайте
Примеры для ввода в поле выражения:
- 2+2
- 3+4
- 3*8
- 7/7
- 3-2
- 2-3
- 6/9
- 6/0
- 7**2
- ((2-1)))
- 2+2*2
- (3-4/2)
- 17/(2-2)
- 11-4*(3+5)
- 81+12*(11+1)