Таймаут - не обработка ошибки

В проектах с внешними интеграциями я не раз встречал одну и ту же логику: поставили таймаут на HTTP-вызов - значит, ошибку обработали.

Поставить таймаут - хорошая идея. Считать, что на этом обработка ошибки закончилась - не очень.

Таймаут говорит только одно: мы перестали ждать ответ. Он не говорит, что внешний сервис ничего не сделал.

Запрос мог дойти до получателя, который спокойно продолжает работу. Ответ мог потеряться по дороге. Операция могла завершиться через секунду после отмены нашего запроса.

После таймаута я бы в первую очередь искал не способ повторить запрос, а понятный путь выяснить результат. Например, передать ключ идемпотентности, запросить статус операции по идентификатору или иметь отдельную компенсацию там, где она действительно возможна.

Ретраи тоже не лечат всё подряд. Повтор безопасен, когда получатель умеет распознать повтор или сама операция идемпотентна. Иначе короткий сетевой сбой превращается в два одинаковых действия.

Полезно разделять в коде как минимум три вещи: сколько ждём, сколько раз готовы попробовать снова и что считаем результатом после того, как не получили ответа. У них разные причины и разные владельцы.

Таймаут защищает ресурсы сервиса. Обработка ошибки начинается следующим вопросом: что теперь известно об операции?

Таймаут - не обработка ошибки | Сетка — социальная сеть от hh.ru Таймаут - не обработка ошибки | Сетка — социальная сеть от hh.ru