У нас есть ресурсоемкий сервис, который используется для ряда преобразований.Это в значительной степени вычислительно связанный (связанный с процессором) процесс.По сути, что происходит, у нас есть брокер сообщений, который отправляет сообщения в службу обработки через Thrift.
Теперь у нас есть несколько различных служб обработки, которые запускают разные алгоритмы для обработки сообщений - эти сообщения направляются одному илибольше обработки алгоритмов.Наши объемы сообщений являются переменными, как и потребности алгоритмов обработки (т. Е. Мы можем получить много сообщений, содержащих XYZ, затем отправить в алгоритм 1, в противном случае отправить в алгоритм 2).
Мы бы хотели расширить это до уровня горизонтального масштабирования.Таким образом, у нас есть несколько узлов, на которых выполняются алгоритмы обработки.Теперь, в зависимости от загрузки сообщений, наши запросы Thrift следует отправлять на разные серверы (предположим, что все службы запускают экземпляр каждой обработки с Algo1 по 3).Скажем, например, что мы получаем большое количество сообщений, которые мы хотим обработать на Algo 1, тогда у нас есть два сервера, на которых работает алгоритм 1, а третий сервер просматривает запросы на два других алгоритма (алгоритм 2 и 3).
Итак, система выглядит следующим образом:
Client ----Request-------|
-----------|--------------------
| Coord & Load Balancer Service | ... like zookeeper
--------------------------------
<--|-->
| Route messages to servers...
Server1: Server2: Server 3:
Algo1 instance Algo1 instance Algo2 instance
Algo3 instance
Все процессы написаны на Java.
Итак, насколько легко было бы что-то подобное настроить с помощью Zookeeper.Я знаю, что, добавляя или изменяя алгоритмы, мы можем легко использовать Zookeeper для обработки конфигурации (например, серверы прослушивают обновления или дополнения алгоритмов и обслуживают их в соответствии с настройками), но как нам управлять аспектом балансировки нагрузки?
Ура!