Некоторые варианты.
Используйте постоянный канал связи
Вместо HTTP поместите сообщения в очередь, которая является высокодоступной и постоянной. Например, Кафка. Пока целевой сервер становится доступным в какой-то момент, он получит сообщение.
Теперь у вас есть компромисс между подготовкой и администрированием сложной подсистемы (очереди). Поэтому убедитесь, что вы анализируете, стоит ли это того.
Откат и повторите
Пусть вызывающий абонент сохранит неудавшийся запрос (возможно, сохраненный на диске) и периодически повторяет попытку. В этом случае важно различать ваш запрос, вызывающий сбой, и просто не работающую службу. Первый, вероятно, из-за ошибки и должен быть зарегистрирован ... повторные попытки, вероятно, не будут иметь значения, пока не будет сделано исправление.
Обнаружить и компенсировать
Периодическая задача проверяет условия согласованности между микросервисами. Например, ошибка регистрируется вплоть до прямых запросов API по мере необходимости. Если это обнаруживает проблему (например, есть заказ, но доставка никогда не получала упаковочный лист), тогда сделайте шаги компенсации. Этими шагами может быть создание заявки в службу поддержки для ручного исправления, или по электронной почте кому-то, или что-то еще.
Рассмотреть варианты дизайна
Подобный случай, вероятно, требует шлюза API для управления вызовами к уязвимым микросервисам. Таким образом, вы контролируете, какая тактика используется для смягчения этой проблемы. Вы, вероятно, не хотите обременять клиентов этими деталями реализации. См. Схему выключателя .
Поскольку микросервисы независимы, всегда будет существовать случай сбоя, который может привести к несогласованности. Вы должны быть готовы делать ручные исправления, когда они возникают.
Если вам требуется сильная согласованность, то микросервисы не подойдут. Если вам по-прежнему нужна масштабируемость, вам может потребоваться изучить сегменты, где связанные данные могут быть размещены в одном и том же сегменте для обеспечения согласованности. Вы все еще можете уменьшить IO, добавив осколки.
Если вам нужна строгая согласованность и у вас нет проблем с масштабируемостью, просто используйте монолитные сервисы. Используйте библиотеки в качестве границ в вашем приложении для разделения проблем.