Каким должен быть код состояния HTTP проверки работоспособности? - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть конечная точка проверки работоспособности на /status, которая возвращает следующие коды состояния и тела ответа:

  • Здоровый - 200 OK
  • Пониженный - ?
  • Нездоровый - 503 Service Unnavailable

Каким должен быть код состояния HTTP для ухудшенного ответа?«Пониженная» проверка используется для проверок, которые действительно были успешными, но медленные или нестабильные .Какой код статуса HTTP имеет наибольшее значение?

Ответы [ 3 ]

0 голосов
/ 07 января 2019

Я бы опасался раскалывать подобные волосы при проверке работоспособности на стороне вышестоящего сервера.Служба, обеспечивающая проверку работоспособности, должна легко (и одновременно) тестировать все свои восходящие зависимости на основе своего собственного набора политик или правил - тайм-аута запроса, сбоев соединения и так далее.На самом деле проверка работоспособности либо работает, либо не работает, и приложение не должно на самом деле отслеживать результаты проверки работоспособности (кроме сбора метрик о том, что произошло).ИМХО проверка состояния здоровья - это рецепт катастрофы.

Обычно я использую следующий интерфейс для проверки работоспособности приложения:

204 - No Content, everything is working within tolerences

500 - Something failed, and here's some details in the response about what went wrong

Где это сложно, зависит от вашей архитектуры.У вас может быть VIP или обратный прокси, который интерпретирует этот ответ и решает, является ли данный узел работоспособным или нет, и в этом случае он собирается либо направить запрос на исправный узел, либо вернуть 503 Service Unavailable.Это решение будет приниматься на основе некоторой политики - x запросов на проверку работоспособности не выполнялось в течение какого-либо периода времени в службах восходящего направления.

Если вы используете сетку, то каждый может передавать данные обратно в реестр служб, чтобы поддерживать состояние работоспособности в актуальном состоянии, и оно может основываться на реальных вызовах служб, а не на проверке работоспособности.

Клиент идеально подходит для принятия решения в зависимости от состояния служб, от которых он зависит, поскольку он может отслеживать различные ответы от службы.Автоматические выключатели являются отличным способом справиться с этим и могут делать это постоянно по фактическим запросам, а не только по проверке работоспособности.Библиотеки выключателей (такие как resilience4j ) сделают это за вас за счет установки некоторых политик о том, сколько неудавшихся / медленных запросов составляют плохую службу.Реестры сервисов, такие как netflix eureka, могут помочь с обнаружением и постоянным мониторингом.

0 голосов
/ 08 января 2019

Наиболее подходящий код состояния HTTP для ответа «ухудшенный» статус от конечной точки работоспособности - это не что иное, как 200 OK.

Я говорю это потому, что не могу найти лучшего кода в официальном реестре кодов состояния Протокол передачи гипертекста (HTTP) , поддерживаемом IANA, на который указывает [RFC7231] HTTP/1.1: семантика и контент .Следует избегать неофициальных кодов, потому что они только усложняют понимание вашего API.

Вы должны разработать свои API так, чтобы они стали простыми в использовании.Имена ресурсов, HTTP-глаголы, коды состояния и т. Д. Должны быть более или менее понятны, чтобы люди, которые уже знают «язык REST», могли сразу понять, как использовать ваш API, без необходимости расшифровывать смутные имена или необычные коды состояния.Что подводит меня к следующей части моего ответа ...

Другие комментарии к вашему дизайну

Самый естественный способ интерпретации ответа 5xx на любой запросявляется то, что операция не удалась.

Таким образом, ответ 503 Service Unavailable на запрос GET /status означает, что сама операция проверки состояния завершилась неудачно.Такой ответ был бы полезен только в том случае, если мы можем быть уверены, что /status является конечным состоянием здоровья , как указано в проекте проверки работоспособности API , указанном в ответе Нкоси:

Конечная точка работоспособности имеет смысл только в контексте компонента, который указывает на работоспособность.У него нет другого значения или цели.Таким образом, его здоровье является проводником здоровья компонента.Клиенты ДОЛЖНЫ предположить, что код ответа HTTP, возвращаемый конечной точкой работоспособности, применим ко всему компоненту (например, более крупному API или микросервису).

Но при URL-пути всего /status не совсем очевидно, что на самом деле является конечной точкой работоспособности.Из просмотра URL мы знаем только то, что он возвращает информацию о статусе чего-либо, но мы не можем быть уверены, что это за «что-то».

Поскольку вы также говорите нам, что да, это на самом деле конечная точка здоровья, я должен предложить вам изменить имя на health.Я бы также предложил разместить его под некоторым базовым путем, например /things/health, чтобы было более понятно, какой компонент указывает на его работоспособность.

Если, с другой стороны, /status был фактически ресурсомон владеет, то есть чем-то, что представляет состояние некоторого другого компонента / предмета (как в настоящее время предлагает его название), тогда 200 OK является единственным разумным статусом для успешных вызовов, даже если то, что оно указывает настатус "Нездоровый".В этом случае 5xx будет означать, что статус не может быть получен, и предполагается, что детали в полезной нагрузке ответа связаны со сбоем в самой службе /status.

Так что будьте осторожны с тем, как вы называете вещи и какие коды состояния вы используете!

0 голосов
/ 03 января 2019

Подумайте о возврате пользовательского кода в диапазоне 2xx Success , который еще не принят в известных / общих кодах состояния.Аналогично некоторым неофициальным кодам , не поддерживаемым ни одним стандартом.

Например, 218 This is fine (Apache Web Server)

Используется в качестве общего условия ошибки для разрешения телам ответов проходить через Apache, когда включен ProxyErrorOverride.Когда ProxyErrorOverride включен в Apache, тела ответов, содержащие код состояния 4xx или 5xx, автоматически сбрасываются Apache в пользу общего ответа или пользовательского ответа, указанного в директиве ErrorDocument

После выполнения некоторыхисследование Я наткнулся на черновик

Формат ответа проверки работоспособности для HTTP-API: draft-inadarei-api-health-check-03

Там, где они также внесли аналогичные предложения

В случае состояния «предупреждение» конечные точки ДОЛЖНЫ возвращать состояние HTTP в диапазоне 2xx-3xx, и ДОЛЖНА быть предоставлена ​​дополнительная информация, используя дополнительные поля ответа.

, где статус warn в черновике равен healthy, with some concerns, что, как я считаю, близко соответствует вашей желаемой модели.

Хотя это и не является окончательным, я думаю, что оно дает некоторые идеи дляпомощь с возможным дизайном.

...