Запуск расчетов на нескольких узлах
По умолчанию приложение горизонтально масштабирует вычисления за счет подключения внешних расчетчиков (воркеров). В такой конфигурации (режим воркера) из всего ядра серверной части используется только компонент-расчетчик, который и выполняет задачи. Количество расчетчиков не ограничено и должно вычисляться с учетом количества пользователей и оценки количества расчетов.
Серверная часть платформы может работать в одном из трех режимов:
- Режим координатора Coordinator: только управление очередью и распределение задач;
- Режим расчетчика Worker: только выполнение расчетных задач (используется часть ядра - расчетчик);
- Полный режим ALL (объединяет функции координатора и воркера, то есть запускается полное ядро системы).
Режимы работы
Режим координатора
Приложение обрабатывает запросы от клиентской части. Запросы, инициирующие расчеты, помещаются в очередь сообщений. Приложение, работающее в данном режиме, называется Координатор.
Режим расчетчика
Извлекает и рассчитывает задачи из очереди сообщений, созданной координатором. Не взаимодействует с пользовательским приложением. Приложение, работающее в данном режиме, называется Воркер (worker) или расчетчиком.
Режим ALL (Полный режим)
Совмещает роли координатора и воркера. Такое приложение одновременно принимает пользовательские запросы (как координатор) и выполняет задачи из очереди (как расчетчик). Приложение. работающее в данном режиме, называется ALL-in-one или полным узлом.
Установка
Для перевода приложения из одного режима в другой необходимо в настройках приложения указать тип запуска в конфигурации приложения (или через переменные окружения):
Важно
Если у координатора не будет ни одного воркера, он перейдет в режим расчетов, аналогичный режиму ALL
При этом для режимов Координатор и Воркер необходимо указывать адрес очереди сообщения RabbitMQ.
Ресурсы
При запуске приложения в режиме Координатор с использованием воркеров можно ограничить использование ресурсов средствами docker, так как каждый экземпляр приложения запускается в виде отдельного контейнера. При этом воркеры могут быть развернуты на любом вычислительном узле (node), включая отличные от хоста основного приложения.
Если воркеру недостаточно ресурсов для выполнения задачи, он перезагружается, а задача автоматически передается другому доступному воркеру.
Если по какой-то причине воркеры трижды не смогли рассчитать задачу, она переводится в режим "Запрещена для расчета" и может быть возвращена обратно только ручным переключением этой опции в настройке графа.
Важно
Принцип передачи задачи на вычисление с использованием воркера - FIFO. Первый воркер, который будет доступен, возьмет задачу на расчет. Воркеры не ранжируются по возможностям и ресурсам.
Работа с RabbitMQ
Очередь сообщений между координатором и воркерами реализована через RabbitMQ.
Работа воркера (для сервера RabbitMQ является консьюмером - consumer)
- При запуске воркер устанавливает соединение с сервером RabbitMQ;
- Затем воркер подключается к заданной очереди. Если очередь не существует, она создается автоматически;
- После подключения воркер переходит в режим прослушивания и ожидает поступления новой задачи;
- При появлении задачи в очереди воркер немедленно получает ее;
- Воркер выполняет расчет полученной задачи;
- По окончании расчета воркер отправляет серверу подтверждение об успешном выполнении;
- Цикл повторяется: воркер возвращается к шагу 3 и продолжает ожидать следующие задачи.
Работа координатора (для сервера RabbitMQ является продюсером - producer)
- Координатор находится в режиме ожидания запросов от клиентского приложения;
- При поступлении запроса выполняется его анализ;
- Если запрос относится к категории расчетных (расчет графа, блока, ветки, события), осуществляется переход к п. 7. В противном случае выполнение продолжается с п. 4;
- Обработка запроса штатными средствами (без привлечения очереди);
- Возврат результата обработки клиенту;
- Переход в режим ожидания (п. 1);
- Подготовка задания для выполнения расчета;
- Отправка сформированного задания в RabbitMQ посредством REST-запроса;
- Уведомление клиента о принятии задачи в обработку;
- Возврат к ожиданию следующего запроса (п. 1).
Работа сервера RabbitMQ
- Получает сообщения от producer (координатора);
- Складывает их в очередь от данного producer;
- Отправляет свободному 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
