Слишком много остальных API-вызовов в Microservices
Скажем, есть две службы, служба A и служба B.
Служба A нуждается в данных от службы B для обработки запроса. Чтобы избежать тесной связи, мы делаем API-вызов rest к службе B вместо того, чтобы напрямую запрашивать базу данных службы B. Разве выполнение HTTP-запроса к службе B для каждого запроса не уменьшает время ответа? Я видел другое решение для кэширования данных в сервисе А. У меня есть следующие вопросы. 1. Что делать, если данные быстро меняются? 2. Что делать, если данные критически важны, такие как данные учетной записи пользователя, и должна быть строгая согласованность. 3. как насчет дублирования данных и согласованности данных? 4. Вводя остальные вызовы, не вводим ли мы точку отказа? Что делать, если служба B не работает? 5. Также из-за растущих запросов к услуге A для этого конкретного API нагрузка на службу B также увеличивается.
Пожалуйста, помогите мне с этим.
1 ответ
Я думаю, что первый вопрос, который вы должны задать себе, - это действительно ли А и В две разные службы - в чем причина их разделения в первую очередь? В конце концов, они, кажется, связаны как по времени, так и по данным.
Одна из причин разделения службы на два исполняемых файла может заключаться в том, что они могут изменяться независимо или обслуживать разные пути доступа, и в этом случае вы можете рассматривать их как разные аспекты одной и той же службы - теперь это может показаться различием без разницы, но важно смотреть на картину в целом и на то, какие части системы могут знать о внутренних структурах других и защищать систему от превращения в большой грязный ком, где каждая "служба" может получить доступ к любым другим данным "службы", и они все зависят друг от друга
Если эти два компонента действительно являются разными службами, вы также можете рассмотреть возможность перехода к модели, в которой служба B публикует данные, которые активно изменяются. Таким образом, служба A может кэшировать соответствующие части данных B. B по-прежнему является источником правды, а A отделен от доступности B (в зависимости от срока действия данных)
Это много вопросов одновременно, позвольте мне дать несколько комментариев в случайном порядке:
- Если для службы A требуются данные из службы B, то B уже является единственной точкой отказа, поэтому вопрос о надежности просто перемещается из базы данных B в конечную точку API B. Маловероятно, что это имеет большое значение.
- Аналогичный аргумент относится к задержке: хороший уровень API, включая кеширование, может даже уменьшить среднюю задержку.
- Еще раз то же самое с нагрузкой. Зависимость данных A от B уже включает нагрузку на базу данных B. И снова хороший уровень API с кэшированием может даже помочь с нагрузкой.
Таким образом, в то время как разделение (от плотного к свободному) приносит много преимуществ, нагрузка и надежность не обязательно находятся в списке недостатков.
Несколько слов о кешировании:
Кэширование чтения может очень помочь с нагрузкой: как правило, запрос от A до B должен указывать версию запрошенного объекта, которая доступна в кеше (возможно, нет, конечно), тогда конечная точка B может просто проверить, изменился ли объект, и если нет, остановите всю обработку и просто верните "неизмененное" сообщение. B может хранить информацию о том, какие объекты изменились в ближайшем прошлом, в гораздо меньшем хранилище данных, чем сами объекты, скорее всего, хранит их в ОЗУ или даже в процессе, что значительно ускоряет процесс.
Такой механизм гораздо проще внедрить в конечную точку API для B, чем в саму базу данных, поэтому запросы к API могут масштабироваться гораздо лучше, чем запросы к БД.