Это много вопросов одновременно, позвольте мне дать несколько комментариев в случайном порядке:
- Если службе A нужны данные из службы B, то B ужеединственная точка отказа, поэтому вопрос надежности просто перемещается из базы данных B в конечную точку API B.Маловероятно, что это имеет большое значение.
- Аналогичный аргумент относится к задержке: хороший уровень API, включающий в себя кэширование, может даже уменьшить среднюю задержку.
- Еще раз то же самое с нагрузкой:Зависимость данных A от B уже включает нагрузку на базу данных B.И снова хороший уровень API с кэшированием может даже помочь с нагрузкой.
Таким образом, хотя разделение (от плотного до свободного) приносит много преимуществ, нагрузка и надежность не обязательно находятся в списке недостатков..
Несколько слов о кэшировании:
Чтение кэширования может сильно помочь с нагрузкой. Обычно запрос от A до B должен указывать версию запрошенного объекта, которая доступна в кэше.(возможно, нет), конечная точка B затем может просто проверить, изменился ли объект, а если нет, остановить всю обработку и просто вернуть «неизмененное» сообщение.B может хранить информацию о том, какие сущности изменились в ближайшем прошлом, в гораздо меньшем хранилище данных, чем сами сущности, и, скорее всего, хранит их в ОЗУ или даже в процессе, что заметно ускоряет процесс.
ТакойМеханизм гораздо проще внедрить в конечную точку API для B, чем в саму базу данных, поэтому запросы к API могут масштабироваться гораздо лучше, чем запросы к БД.