Текущая архитектура:
Проблема:
У нас есть двухступенчатый поток между интерфейсом и backend-слоями.
- Первый шаг: Интерфейс проверяет ввод I1 пользователя на микросервисе 1 (MS1)
- Второй шаг: Интерфейс представляет I1 и дополнительную информацию для микросервиса 2
Микросервис 2 (MS2) должен проверять целостность I1, поскольку он поступает из интерфейса. Как избежать нового запроса к MS1? Какой лучший подход?
Потоки, которые я пытаюсь оптимизировать для удаления шагов 1.3 и 2.3
Поток 1:
- 1.1 Пользователь X запрашивает данные (MS2_Data) из MS2
- 1.2 Пользователь X сохраняет данные (MS2_Data + MS1_Data) в MS1
- 1.3 MS1 проверяет целостность MS2_Data, используя HTTP-запрос B2B.
- 1.4 MS1 использует MS2_Data и MS1_Data для сохранения и базы данных 1 и создает ответ HTTP.
Поток 2:
- 2.1 Пользователь X уже имеет данные (MS2_Data), хранящиеся в локальном/сеансовом хранилище
- 2.2 Пользователь X сохраняет данные (MS2_Data + MS1_Data) в MS1
- 2.3 MS1 проверяет целостность MS2_Data, используя запрос HTTP B2B
- 2.4 MS1 использует MS2_Data и MS1_Data для сохранения и базы данных 1 и построения ответа HTTP.
Подход
Одним из возможных подходов является использование HTTP-запроса B2B между MS2 и MS1, но мы будем дублировать проверку на первом этапе. Другим подходом будет дублирование данных от MS1 до MS2. однако это является непомерным из-за объема данных и его волатильности. Дублирование не представляется жизнеспособным вариантом.
Более подходящим решением является мое мнение, что внешний интерфейс должен будет взять всю информацию, требуемую микросервисом 1 на микросервере 2, и доставить его на микросервис 2. Это позволит избежать всех этих запросов HTTP в Интернете.
Проблема заключается в том, как микросервис 1 может доверять информации, отправленной интерфейсом. Возможно, используя JWT, чтобы как-то подписать данные из микросервера 1, и микросервис 2 сможет проверить сообщение.
Примечание Каждый раз, когда микросервис 2 нуждается в информации от микросервиса 1, выполняется запрос HTTP в Интернете. (HTTP-запрос использует ETAG и Cache Control: max-age). Как этого избежать?
Цель архитектуры
Микросервис 1 нуждается в данных из микросервиса 2 по требованию, чтобы иметь возможность сохранять MS1_Data и MS2_Data в базе данных MS1, поэтому подход ASYNC с использованием брокера здесь не применяется.
Мой вопрос заключается в том, существует ли шаблон дизайна, передовая практика или структура, позволяющая использовать эту связь.
Недостатком текущей архитектуры является количество запросов HTTP HTTP, которые выполняются между каждым микросервисом. Даже если я использую механизм управления кешем, это повлияет на время ответа каждого микросервиса. Время отклика каждого микросервиса является критическим. Цель здесь состоит в том, чтобы архивировать лучшую производительность, а некоторые - как использовать интерфейс в качестве шлюза для распространения данных через несколько микросервисов, но используя связь с тягой.
MS2_Data - это просто идентификатор SID объекта, такой как SID продукта или SID поставщика, который MS1 должен использовать для поддержания целостности данных.
Возможное решение
Идея состоит в том, чтобы использовать шлюз в качестве обработки запроса шлюза api, который будет кэшировать некоторый HTTP-ответ от MS1 и MS2 и использовать их в качестве ответа на MS2 SDK и MS1 SDK. Таким образом, связь между SYNC или ASYNC не выполняется непосредственно между MS1 и MS2, и дублирование данных также исключается.
Конечно, вышеупомянутое решение предназначено только для совместного использования UUID/GUID через микросервисы. Для полных данных шина событий используется для распределения событий и данных через микросервисы асинхронным способом (шаблон поиска событий).
Вдохновение: https://aws.amazon.com/api-gateway/ и https://getkong.org/
Связанные вопросы и документация:
- Как синхронизировать базу данных с микросервисами (и новой)?
- https://auth0.com/blog/introduction-to-microservices-part-4-dependencies/
- Транзакции через микросервисы REST?
- https://en.wikipedia.org/wiki/Two-phase_commit_protocol
- http://ws-rest.org/2014/sites/default/files/wsrest2014_submission_7.pdf
- https://www.tigerteam.dk/2014/micro-services-its-not-only-the-size-that-matters-its-also-how-you-use-them-part-1/