Для запуска нужно установить Docker Если у вас нет докера, советую качать Docker Desktop тк в нем есть все нужное. Далее его нужно только запустить и дождаться загрузки.
$ git clone https://github.com/vellun/distributed-calculator
$ docker-compose up
http://localhost:3000/
Три горутины, раз в установленное время запрашивают по http задачу для решения у оркестратора. Получив json-ответ, содержащий задачу, отправляют ее калькулятору
Это просто функция, которая принимает от агента задачу, передает вычислителю и ждет пока вычислитель посчитает и запишет ответ в канал. Далее калькулятор post-запросом возвращает уже посчитанную задачу оркестратору. Калькулятор нужен, чтобы освободить агента от ожидания результата задачи
Горутина, получает на вход два числа и оператор и возвращает результат операции. У каждого агента фиксированное количество вычислителей, которые могут считать одновременно, по умолчанию 5
Раз в установленное время проверяет в цикле всех агентов.
Есть срок, по истечении которого с момента последней активности агента, его можно считать пропавшим и ему присваивается статус missing
Также есть срок, по истечении которого с момента последней активности агента, его можно считать умершим и ему присваивается статус dead, из-за чего агент больше не запрашивает задачи для решения
Чекер проверяет эти сроки и присваивает статусы, а также проверяет их, и если у агента статус dead, он заменяется новым, которому присваивается id прежнего.
Сервер, занимающийся приемом выражений, парсингом и добавлением выражений и подвыражений в базу данных.
Также занимается обработкой запросов с фронтенда и от агентов.
Занимается всеми операциями, связанными с базой данных
Калькулятор пока может производить только бинарные операции с целыми числами и поддерживает только + - * / (при делении берет целую часть)
Реализован фронтенд, предоставляющий такие страницы:
Все вычисления, время начала и окончания каждого
Страница, где можно редактировать время выполнения операций
Все агенты, их статусы и время последней активности. Можно отключить агента, нажав на кнопку disconnect напротив нужного. Ему присвоится статус dead, и как только чекер здоровья это зафиксирует, отключенный агент будет заменен новым.
Ну и страница с самим калькулятором
Отказоустойчивость достигается тем, что задачи не привязаны к определенному агенту или вычислителю. Оркестратор по запросу агента отдает ему на решение самую старую задачу со статусом waiting, которую сможет найти в базе данных. Так что если агент падет, не успев решить задачу, она попадет к другому агенту.
Также упавшие агенты заменяются на новые во время работы приложения