Какие ошибки HTTP никогда не должны запускать автоматическую повторную попытку?

Я пытаюсь сделать несколько микросервисов более устойчивыми и повторить некоторые типы HTTP-запросов, которые помогут с этим.

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

Я полагаю, есть другие причины не повторять несколько других типов ошибок, но какие ошибки и почему?

Ответ 1

Есть некоторые ошибки, которые нельзя повторять, потому что они кажутся постоянными:

  • ошибка 400, неверный запрос
  • 401 Несанкционированный
  • 402 Требуется оплата
  • 403 Запрещено
  • 405 Метод не разрешен
  • 406 Не допускается
  • 407 Требуется прокси-аутентификация
  • 409 Конфликт - это зависит
  • 410 ушел
  • 411 Требуемая длина
  • 412 Условие не выполнено
  • 413 Слишком большая полезная нагрузка
  • 414 URI слишком длинный
  • 415 Неподдерживаемый тип носителя
  • 416 Диапазон Не угадывается
  • 417 Ошибка ожидания
  • 418 Я чайник - не уверен в этом
  • 421 Неверный запрос
  • 422 Непроцессная организация
  • 423 Заблокировано - это зависит от того, как долго ресурс блокируется в среднем (?)
  • 424 Неудачная зависимость
  • 426 Требуется обновление - может ли клиент быть обновлен автоматически?
  • 428 Требуемое условие - я не уверен, что предварительное условие может быть выполнено во второй раз без отрыва от начала всего процесса, но это зависит
  • 429 Слишком много запросов - это зависит, но его нельзя повторять
  • 431 Поля заголовка запроса слишком велики
  • 451 недоступен по юридическим причинам

Таким образом, большинство ошибок 4 ** Client не следует повторять.

Ошибки сервера 5 **, которые не следует повторять:

  • 500 - внутренняя ошибка сервера
  • 501 Не реализовано
  • 502 Bad Gateway - я видел, что использовал временные ошибки, так что это зависит
  • 505 HTTP-версия не поддерживается
  • 506 также обсуждает
  • 507 Недостаточное хранение
  • Обнаружена петля 508
  • 510 не расширен
  • Требуется сетевая аутентификация 511

Однако, чтобы сделать микросервисы более эластичными, вы должны использовать шаблон автоматического выключателя и быстро выйти из строя, когда восходящий поток не работает.

Ответ 2

4xx означает, что на стороне вызывающего абонента была сделана ошибка. Это может быть плохой URL-адрес, неправильные учетные данные для проверки подлинности или что-либо, что указывает на то, что это был плохой запрос. Поэтому, не исправляя эту проблему, повторная попытка не используется. Ошибка в домене вызывающего абонента, и вызывающий абонент должен ее исправить, а не надеяться, что он исправит себя.

Есть исключения. Представьте себе, что служба перераспределяется или перезапускается. В этом случае нет конечной точки, зарегистрированной и, следовательно, отправит код 4xx http. Однако через минуту сервер может быть доступен. Поэтому повторная попытка может показаться полезной.

Более глубокий анализ покажет, что услуга при перезапуске должна быть перезапущена для предотвращения сбоев. Следовательно, предыдущий аргумент больше не выполняется. Однако, если ваша окружающая среда/экосистема не соответствует этой практике, и вы считаете, что сообщение об ошибке на стороне клиента (коды 4xx) стоит повторить по вышеупомянутой причине, тогда вы можете сделать это; но зрелые системы не будут делать этого из-за отсутствия каких-либо преимуществ, воспринимаемых и утративших быстрые способности.

Коды ошибок 5xx следует повторять, так как это служебные ошибки. Они могут быть краткосрочными (переполненные потоки, зависимые службы, отказывающиеся от соединений) или долгосрочные (системный дефект, зависание системы, отсутствие инфраструктуры). Иногда службы возвращают информацию (часто заголовки), является ли это постоянным или временным; и иногда параметр времени, когда нужно повторить попытку. Исходя из этих параметров, абоненты могут выбрать повтор или нет.

Коды 1xx, 2xx и 3xx не должны быть повторены по очевидным причинам.