Интересует опыт реализации своего Load balancer. Есть несколько серверов типа кластера, обрабатывающих графику, фрамеворк самописный данные передаются по tcp/ip и udp. Фактические на кластере обрабатываются двоичные данные поступающие из одного места, компьютеры в кластере SMP, операции интенсивно нагружают как диск так и оперативную память с процессором. У кого какой есть опыт как грамотно построить архитектуру балансировщика, а также алгоритм распределения данных по хостам в зависимости от их текщей загрузки?
Самый простой способ создать очередь задач и запустить на каждом рабочей машине фиксированное количество процессов. Раз количество процессов фиксированное, будет ограничено количество одновременных запросов к оборудованию.
Каждый процесс будет брать из очереди задание, выполнять его и ждать следующего. И так в цикле до бесконечности. Хост, к-ый полностью загружен просто не будет брать задания.
Это при условии того, что вам нужен максимальный throughput, и затраты на постановку задания в очередь и его миграцию на узел значительно меньше затрат на обработку.
Дальше начинаются танцы с бубном.
* Какой критерий оптимизации throughput или latency?
* Есть ли разделяемое хранилище данных или нужно лить задания сразу на хосты?
* Длительность выполнения задания?
* Какое время миграции задания на хост?
* Есть ли нагрузка на хосты другими приложениями?
* Задания одинакового размера или разные?
* Нужно ли повторять задание, если хост который его взял на выполнение — упал?
+1. Очередь плюс пул исполнителей хорошо ложится на не-интерактивную обработку.
В зависимости от реализации может понадобиться следить/ограничивать глубину очереди.