Гарантированная обработка запросов в распределенном приложении
Мне нужна консультация по Java приложению.
У меня есть распределенное на кластера приложение A и внешние приложения B, C, D и остальные, всего ~ 50. В мое приложение A идет поток запросов клиентов, суммарный 15 tps. На каждый запрос я делаю вызовы в приложения B, C, D... Но приложение B выставило мне rate limiter равный 1 tps, а C - равный 10 тпс. У каждого приложения свои tps
Задача:
1)гарантировано обрабатывать все сообщения от клиентов(если приложение упало, запрос от клиента не должен «потеряться», а должен так же быть обработан, те отправлены запросы в смежные приложения);
2)управлять исходящим rate limiter;
Было две идеи для реализации части 1 - Кафка или база данных.
Если сделать общий топик в Кафке и из него вычитывать сообщения, отравлять в соответствующую систему согласно типу сообщения, то вся скорость будет замедляться до скорости приложения B и ее 1 тпс.
Если сделать отдельный топик для вызова каждого приложения - 50 producer и 50 consumer - не слишком ли много ресурсов приложения уйдет на это?
База данных - записывать в таблицу с типами для каждого приложения и 50 шедуллеров? Не слишком ли большая нагрузка на БД - 50 инсертов, 750 апдейтов, 50 селектов каждую секунду?
Подскажите, какие есть решения, лучшие практики, примеры приложений?