Балансировка/Резервирование на уровне приложения JAVA
Имею Java приложение, которое имеет XML конфигурацию с 10 задачами (каждая задача работает по шедуллеру в определённое время описанное в конфиге). Для целей балансировки нагрузки, хочу чтобы было несколько приложений (5) с одной и той же конфигурацией, но при этом они могли между собой договориться, кто какие задача обрабатывает пока между ними всеми есть связь. Дополнительно, если кто-то упал (стало 4 приложения), то они должны перераспределить ответственность, кто и какие задачи обрабатывает.
Т.е. главная цель, чтобы задачи не выполнялись параллельно несколькими экземплярами приложений. Но при этом, даже если осталось живое только 1 приложение, всё равно должны задачи выполняться (хоть и одним приложением).
Мне видится, что это какая то master/slave архитектура должна быть. Но если жёстко зашить в конфиге, кто мастер, а кто слейв, то будет проблема если упал мастер. Значит нужно вычислять мастера динамически?! Дополнительно нужно делать некий heartbeat, чтобы подтверждать свой активный статус?!
Подскажите, что бы не изобретать велосипед, существуют ли уже готовые реализации по балансировке/резервированию? Может это как то можно сделать через Spring? Если самому делать реализацию, какой протокол использовать, чтобы максимально просто было, REST?