Ловушка eventual consistency или uncommitted transaction problem?
Интересный эффект я наблюдал во время интеграции с одной из внешних систем. Мой сервис должен был выполнить два последовательных запроса: сначала — на создание сущности в сторонней АС, затем — на изменение её статуса.
К моему удивлению, несмотря на то, что первый запрос завершался успешно (получен положительный ответ), второй запрос, отправляемый сразу после, возвращал ошибку о том, что сущность не найдена. При этом, если между запросами добавлялась небольшая задержка — например, в несколько сотен миллисекунд — цепочка работала корректно.
Исходный код той системы мне недоступен, но, скорее всего, проблема связана с особенностями реализации внутри неё. Вероятно, ответ на запрос создания сущности возвращается до полного завершения транзакции в базе данных — например, внутри транзакции, а не после. В таком случае, хотя клиент уже получил подтверждение о создании, сама сущность ещё не видна для последующих операций.
Этот случай стал хорошим напоминанием: даже при успешном ответе от API нельзя всегда полагаться на мгновенную консистентность данных на стороне сервера.