@RSalo

Как правильно все перенести в микросервисы и сделать устойчивую архитектуру?

Всем привет. Пытаюсь понять, как правильнее сделать устойчивую к сбою архитектуру на микросервисах. Предположим, у нас есть какая-то цепочка независимых сервисов внутри системы, которые общаются между собой по API. Как правильнее сделать транзакцию на откат, если в цепочке запросов микросервисов, так называемой "саге" произошел сбой? Делать отдельный экшены на откат к предыдущему сервису? Но такая схема не будет работать, так как изначально сервисы, в которых операция прошла успешно не знают, что в каком-то следующем сервисе произошел сбой. Например, у нас есть два сервиса, первый - отправление на почту пароля пользователя, а второй - регистрации пользователя. Если у нас "ляжет" микросервис с регистрацией пользователя, то первый сервис в любом случае отправит пароль, но не будет знать, что "лежит" второй сервис без непосредственного запроса на него. Есть еще идея, если есть цепочка из микросервисов, то все запросы делать через MQ RPC. И таким образом можем делать разветвленную систему саг, в которых будет постоянный мониторинг запросов других сервисов, и если в одном из них произошел сбой, то делать откат, либо просто ничего не делать. Но тут тогда возникает вопрос, что делать с "ненадежными" микросервисами, которые располагаются на другой стороне и которые не хочется включать в общий пулл MQ или вообще сообщение между ними происходит по другим сценариям? Делать дополнительный anticorruption слой для таких случаев? Буду рад Вашим идеям.
  • Вопрос задан
  • 192 просмотра
Решения вопроса 1
inoise
@inoise
Solution Architect, AWS Certified, Serverless
Итак, куча всего смешана, давайте разбираться. У нас имеется:
- X различных сервисов с различными интерфейсами
- отсутствие транзакционности
- отсутствие гарантии доступности сервисов
- необходимость это все контролировать

Как в реальности это решается:
- Saga Pattern - отличная вещь, появилась именно как микросервисная транзакционность
- нам потребуется оркестрация. Я не очень в курсе что сейчас по on-prem решениям но из моего мира есть AWS StepFunctions. Ищем аналоги для своего энва
- если нет готовых решений то придется строить свою событийную архитектуру на очередях с брокерами и медиаторами
- для проблемы не доступности сервисов придется использовать exponential backoff или exponential retry. Опять, же, в моем мире это решает AWS SNS.

Вообще, во времена до облаков я такое делал на RabbitMQ и смекалке, но с любыми такими системами встает проблема валидация контрактов, так что только вам решать на какую часть переносить сложность.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы