Перейти к содержанию

Запуск расчетов на нескольких узлах

По умолчанию приложение горизонтально масштабирует вычисления за счет подключения внешних расчетчиков (воркеров). В такой конфигурации (режим воркера) из всего ядра серверной части используется только компонент-расчетчик, который и выполняет задачи. Количество расчетчиков не ограничено и должно вычисляться с учетом количества пользователей и оценки количества расчетов.

Серверная часть платформы может работать в одном из трех режимов:

  1. Режим координатора Coordinator: только управление очередью и распределение задач;
  2. Режим расчетчика Worker: только выполнение расчетных задач (используется часть ядра - расчетчик);
  3. Полный режим ALL (объединяет функции координатора и воркера, то есть запускается полное ядро системы).

Режимы работы

Режим координатора

Приложение обрабатывает запросы от клиентской части. Запросы, инициирующие расчеты, помещаются в очередь сообщений. Приложение, работающее в данном режиме, называется Координатор.

Режим расчетчика

Извлекает и рассчитывает задачи из очереди сообщений, созданной координатором. Не взаимодействует с пользовательским приложением. Приложение, работающее в данном режиме, называется Воркер (worker) или расчетчиком.

Режим ALL (Полный режим)

Совмещает роли координатора и воркера. Такое приложение одновременно принимает пользовательские запросы (как координатор) и выполняет задачи из очереди (как расчетчик). Приложение. работающее в данном режиме, называется ALL-in-one или полным узлом.

Установка

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

type_run = "ALL"
          # Тип запуска, возможные значения:
          #   Coordinator
          #   Worker
          #   ALL

Важно

Если у координатора не будет ни одного воркера, он перейдет в режим расчетов, аналогичный режиму ALL

При этом для режимов Координатор и Воркер необходимо указывать адрес очереди сообщения RabbitMQ.

Ресурсы

При запуске приложения в режиме Координатор с использованием воркеров можно ограничить использование ресурсов средствами docker, так как каждый экземпляр приложения запускается в виде отдельного контейнера. При этом воркеры могут быть развернуты на любом вычислительном узле (node), включая отличные от хоста основного приложения.

Если воркеру недостаточно ресурсов для выполнения задачи, он перезагружается, а задача автоматически передается другому доступному воркеру.

Если по какой-то причине воркеры трижды не смогли рассчитать задачу, она переводится в режим "Запрещена для расчета" и может быть возвращена обратно только ручным переключением этой опции в настройке графа.

Важно

Принцип передачи задачи на вычисление с использованием воркера - FIFO. Первый воркер, который будет доступен, возьмет задачу на расчет. Воркеры не ранжируются по возможностям и ресурсам.

Работа с RabbitMQ

Очередь сообщений между координатором и воркерами реализована через RabbitMQ.

Работа воркера (для сервера RabbitMQ является консьюмером - consumer)

  1. При запуске воркер устанавливает соединение с сервером RabbitMQ;
  2. Затем воркер подключается к заданной очереди. Если очередь не существует, она создается автоматически;
  3. После подключения воркер переходит в режим прослушивания и ожидает поступления новой задачи;
  4. При появлении задачи в очереди воркер немедленно получает ее;
  5. Воркер выполняет расчет полученной задачи;
  6. По окончании расчета воркер отправляет серверу подтверждение об успешном выполнении;
  7. Цикл повторяется: воркер возвращается к шагу 3 и продолжает ожидать следующие задачи.

Работа координатора (для сервера RabbitMQ является продюсером - producer)

  1. Координатор находится в режиме ожидания запросов от клиентского приложения;
  2. При поступлении запроса выполняется его анализ;
  3. Если запрос относится к категории расчетных (расчет графа, блока, ветки, события), осуществляется переход к п. 7. В противном случае выполнение продолжается с п. 4;
  4. Обработка запроса штатными средствами (без привлечения очереди);
  5. Возврат результата обработки клиенту;
  6. Переход в режим ожидания (п. 1);
  7. Подготовка задания для выполнения расчета;
  8. Отправка сформированного задания в RabbitMQ посредством REST-запроса;
  9. Уведомление клиента о принятии задачи в обработку;
  10. Возврат к ожиданию следующего запроса (п. 1).

Работа сервера RabbitMQ

  1. Получает сообщения от producer (координатора);
  2. Складывает их в очередь от данного producer;
  3. Отправляет свободному consumer.

Для настройки необходимо указать конфигурацию для подключения к очереди.

# --- Настройка RabbitMQ ---
rabbit_protocol = "http"            # Протокол api
rabbit_host = "hostname"            # Адрес сервера RabbitMQ
rabbit_port = 5672                  # Порт RabbitMQ для amqp
rabbit_port_api = 15672             # Порт RabbitMQ для api
rabbit_virtual_host = ""            # Суффикс к серверу RabbitMQ
rabbit_user_login = "rabbit_user"   # Логин к серверу RabbitMQ
rabbit_user_password = "pa$$word"   # Пароль к серверу RabbitMQ
rabbit_heartbeat = 600              # Время опроса сервера RabbitMQ,
                                    # что он доступен (в секундах)
rabbit_timeout = 1                  # Время ожидания ответа
                                    # (в секундах)

В настройках RabbitMQ параметр consumer_timeout должен быть больше, чем параметр calc_max_calculation_time в настройках приложения backend.

Дополнительные ссылки

Официальный сайт RabbitMQ