Есть ли шаблон или практика, которую я могу использовать, чтобы помочь с сервисами, которые либо не работают, либо не работают, а другие стабильны?
Что делать, если у меня есть три микросервиса, и два из них хороши, а один умирает прямо посреди POST? Двое получат ПОЧТУ, а один - нет. Я не думаю, что могу совершать транзакции, потому что я отправляю свои запросы в службу.
Как мне дизайн для этого? Я не хочу потерянные данные в различных базах данных.
Ответы:
Некоторые варианты.
Используйте постоянный канал связи
Вместо HTTP поместите сообщения в очередь, которая является высокодоступной и постоянной. Например, Кафка. Пока целевой сервер становится доступным в какой-то момент, он получит сообщение.
Теперь у вас есть компромисс между подготовкой и администрированием сложной подсистемы (очереди). Поэтому убедитесь, что вы анализируете, стоит ли это того.
Откат и повторите
Пусть вызывающий абонент сохранит неудавшийся запрос (возможно, сохраненный на диске) и периодически повторяет попытку. В этом случае важно различать ваш запрос, вызывающий сбой, и просто не работающую службу. Первый, вероятно, из-за ошибки и должен быть зарегистрирован ... повторные попытки, вероятно, не будут иметь значения, пока не будет сделано исправление.
Обнаружить и компенсировать
Периодическая задача проверяет условия согласованности между микросервисами. Например, ошибка регистрируется вплоть до прямых запросов API по мере необходимости. Если это обнаруживает проблему (например, есть заказ, но доставка никогда не получала упаковочный лист), тогда сделайте шаги компенсации. Этими шагами может быть создание заявки в службу поддержки для ручного исправления, или по электронной почте кому-то, или что-то еще.
Рассмотреть варианты дизайна
Подобный случай, вероятно, требует шлюза API для управления вызовами к уязвимым микросервисам. Таким образом, вы контролируете, какая тактика используется для смягчения этой проблемы. Вы, вероятно, не хотите обременять клиентов этими деталями реализации. См. Схему выключателя .
Поскольку микросервисы независимы, всегда будет существовать случай сбоя, который может привести к несогласованности. Вы должны быть готовы делать ручные исправления, когда они возникают.
Если вам требуется сильная согласованность, то микросервисы не подойдут. Если вам по-прежнему нужна масштабируемость, вам может потребоваться изучить сегменты, где связанные данные могут быть размещены в одном и том же сегменте для обеспечения согласованности. Вы все еще можете уменьшить IO, добавив осколки.
Если вам нужна строгая согласованность и у вас нет проблем с масштабируемостью, просто используйте монолитные сервисы. Используйте библиотеки в качестве границ в вашем приложении для разделения проблем.
источник
Я думаю, что вы описываете проблему консенсуса: вы не хотите фиксировать, пока каждый участник распределенной транзакции не скажет, что операция прошла успешно. Простым решением этого является двухфазный коммит. По сути, он выполняет этап транзакции в каждой системе, пока каждый не сообщит, что подготовка прошла успешно (этап 1). Если каждый участник транзакции возвращает успех, каждому из них предлагается совершить транзакцию; если какой-либо из них возвратил ошибку, выдается откат (этап 2). Это может привести к появлению более сложного решения Three Phase Commit. Вы можете прочитать намного лучшее описание каждого здесь:
http://the-paper-trail.org/blog/consensus-protocols-two-phase-commit/
http://the-paper-trail.org/blog/consensus-protocols-three-phase-commit/
источник