Java-решение с открытым исходным кодом для распределения заданий и запуска нескольких рабочих JVM

Цель

Я ищу Java-решение с открытым исходным кодом, которое можно использовать в небольшом (2-4) кластере Linux-машин. Вы можете думать об этом как о ферме обрабатывающих рабочих серверов, которые просто прослушивают сообщение от конечной точки JMS, чтобы начать обработку.

Требования

Эта библиотека/решение/что угодно должно иметь возможность запускать около 10–20 процессов на каждой машине из кластера (каждый из которых является JVM). Каждый процесс будет получать сообщение из централизованного экземпляра JMS и сохранять результаты задания в централизованном экземпляре СУБД. Каждый процесс занимает несколько минут (от 5 до 50 минут) и требует мало ресурсов сети, операций ввода-вывода на диск, ЦП и памяти. Каждая работа независима. Библиотека должна просто помогать управлять этим выделением/освобождением процессов JVM и обеспечивать некоторую минимальную статистику и контроль. Нет необходимости приостанавливать/возобновлять/отменять задания. Мне просто нужно знать, когда они работают или нет, и успешно ли они завершились. Содержание простаивающих рабочих серверов не является проблемой.

Важно : я не ищу PaaS или какое-либо облачное решение.

Что я знаю

Первоначально я рассматривал идею просто запустить несколько экземпляров tomcat, но это кажется излишним, и мне придется предоставить каждому из них разные порты. Это не проблема «разделяй и властвуй», поэтому я не ищу решений для уменьшения карты. Это также не то, что можно решить с помощью хаупа (я думаю). Но, признаюсь, я мало знаю о такого рода решениях. Я немного читал о JavaSpaces и RMI, но кажется, что это строительные блоки для распределенных решений. Я также слышал о микросервисах, но они просто кажутся чем-то более полезным для оркестровки различных частей всего процесса. Я также проверил memcache, hazelcast, terracota, но они предназначены для решения другого класса проблем.

Мое чувство

заключается в том, что это какая-то хорошо известная проблема с несколькими интересными решениями, но я просто не знаю, как именно она называется (и тогда я не могу правильно погуглить).

Разве Apache YARN, Mesos и т. д. не пытаются сделать именно это (и немного больше: управлять распределением ресурсов)?
@ Anony-Mousse посмотрит на это, спасибо за внимание!

Ответы (2)

Я не знаю готового решения этой проблемы (и без причудливого имени), но предпочел бы настроить его самостоятельно (на Java). Кроме того, мои навыки JMS находятся «в разработке», поэтому могут быть лучшие решения, объединяющие части 1 и 2. И я не совсем уверен, правильно ли я понял вашу проблему.

Я предполагаю, что рабочие сами обрабатывают свои подключения к базе данных, поэтому я не буду это учитывать.

Первая часть: Распределитель. Компонент, управляемый сообщениями, который потребляет ваши сообщения JMS и обрабатывает их. Поскольку вам не нужен сервер приложений на всех машинах, теперь вам нужен только один.

Вторая часть: Frontworker — Java-программа, которая работает на каждой машине и держит открытым порт для связи с дистрибьютором. Им действительно нужен какой-то формат обмена, RMI — самое прямое решение, по моему опыту, для этого.

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

Последняя часть: Монитор - читает базу данных. Данные отображаются в виде простой таблицы. Fancy Reports возможно через JasperReports.

Поток данных будет таким: поставщик данных JMS отправляет свои сообщения, которые потребляются распространителем. Дистрибьютор дополнительно проверяет, на каком сервере в данный момент работает наименьшее количество рабочих процессов, или выполняет циклический перебор. Затем он открывает соединение RMI с фронтворкером на этом конкретном сервере и передает информацию JMS. Фронтворкер запускает рабочий процесс с информацией. Каждый работник вносит свои данные в базу данных независимо друг от друга.

Монитор будет использоваться независимо от этого и просто читать базу данных о работе, которую выполняют работники.

Привет Анджело, это имеет большой смысл. Проведя небольшое исследование, я думаю, что собираюсь использовать подобную стратегию, но слияние дистрибьютора и фронтворкера, потому что фронтворкер может напрямую читать из JMS. В вашей идее меня особенно интересует то, как фронтворкер запустит рабочего. Процессбилдер? Спасибо за вашу помощь.

Я бы использовал планировщик Quartz для этого.

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

Это открытый исходный код, написанный на Java.