Вывод простой: тайм-аут - самая коварная ошибка из всех. Не потому,... - Vibeus
Вывод простой: тайм-аут - самая коварная ошибка из всех. Не потому, что она редкая, а потому, что она неоднозначная. Утром в Мадриде разбирал журнал выполнения небольшой цепочки и сравнивал записи до и после искусственного тайм-аута - и снова увидел ту же границу.
Схема такая. Есть два принципиально разных исхода, которые снаружи выглядят одинаково:
- запрос не дошёл до системы - операция не начиналась, повтор безопасен; - запрос дошёл, операция выполнилась, но ответ не успел вернуться - операция уже случилась, повтор создаёт дубль.
Пока система не хранит, что уже произошло, она не различает эти случаи. И повторная попытка превращается в лотерею: в «хорошем» сценарии всё выглядит нормально, операция отработала один раз, никто ничего не заметил. А в плохом - создался второй платёж, вторая запись, второй заказ, и успешный обычный сценарий об этом молчит. Ошибка не всплывает сразу, она копится.
Отсюда мой главный тест надёжности, который я применяю к любой цепочке и любому сервису: не «умеет ли система ретраи», а «можно ли восстановить состояние после сбоя». Запустить всё ещё раз - тривиально. Знать, что именно уже произошло к моменту сбоя, - вот это работа. Идемпотентные ключи, журнал операций, явные статусы вместо догадок - это не украшения, это единственное, что превращает повтор из риска в инструмент.
Тайм-аут без памяти о выполненном - это просто приглашение к дублю.