Здесь есть много возможных дизайнов, все они в значительной степени зависят от того, чего вы на самом деле пытаетесь достичь:
Вы говорите:
В текущей версии приложения размещается на одном сервере и создает несколько потоков (~ 10), для которых у всех есть заданная задача c
Предположим, вы go с опцией 2, и все потоки работают на одном узле из трех.
В данном случае это своего рода архитектура active-passive , один узел работает, другие узлы практически ничего не делают (ну, я не знаю, может быть, они делают другие вещи, это выходит за рамки, основанные на информации, которую вы дали). Таким образом, эти узлы поддерживаются для избыточности?
Но если это так, рабочий узел будет «поглощать» всю нагрузку до тех пор, пока не выйдет из строя, тогда вся нагрузка попадет на узел, который становится активным, но, возможно, его слишком большая нагрузка и он потерпит неудачу, тогда третий узел выйдет из строя, как домино:)
Еще одна проблема с этим подходом заключается в том, как на самом деле сделать node2
активным, когда node1
не удалось, Кто решит, что node2
(в отличие от node3
) сейчас активен? Как вы создаете потоки, если конфигурация "run-Without-Threads" уже указана?
Если вы можете ответить на эти вопросы, не ожидайте высокого давления на один узел и согласитесь поддерживать узлы для резервирования - может ли это быть способом go, многие системы построены таким образом, поэтому Это жизнеспособное решение.
Другое решение заключается в полномасштабном масштабировании решения с архитектурой active-active , так что часть задач будет выполняться node1
, другая часть - быть обработанным node2
и node3
.
Здесь есть много возможных вариантов. Вы говорите
, для которого все получили заданную задачу c
Кто на самом деле запускает эту задачу для выполнения? Это какое-то запланированное задание, которое запускается время от времени и передает задание на выполнение? Или, может быть, задача порождается в результате некоторого запроса от клиента (например, через HTTP-вызов)?
Другой вопрос: существуют ли задачи, которые в принципе не должны перекрываться, или потенциально каждая задача может повредить выполнение другая задача?
Если есть возможность разделить задачи, вы можете отправить сообщение в некоторую очередь, когда прибудет новая задача, и на основе какого-либо partitionId (если вы используете что-то вроде kafka) или ключа маршрутизации в rabbit mq или любом другом В качестве способа кластеризации можно создать архитектуру, в которой задачи можно сгруппировать по типу, а один указанный c сервер будет заботиться о выполнении всей группы задач, другая группа задач может быть выполнена другим сервером.
Если сервер будет go выключен, то группа задач, ранее обработанных отказавшим сервером, будет переназначена на другой сервер (технические характеристики зависят от решения).