
Ошибка 503 Service Unavailable - это единственная серверная ошибка, которая обычно возникает намеренно. Нечто решило, что этот запрос прямо сейчас обслужен не будет, и сказало об этом, вместо того чтобы попытаться и не справиться.
Это делает её белой вороной в своём семействе. Ошибка 500 - это код, сломавшийся во время выполнения. Ошибка 502 - это прокси, получивший непригодный ответ от того, что стоит за ним. Ошибка 504 - это то же самое, так и не ответившее вовремя. Все три - это сбои. Ошибка 503 - это решение.
Четыре вещи, принимающие это решение
В браузере они выглядят одинаково и означают совершенно разное для того, кто держит сайт.
Режим обслуживания. Кто-то намеренно поставил сайт за страницу-заглушку, пока идёт миграция или выкатывается релиз. Здесь ошибка 503 работает ровно так, как задумано, и это единственный случай, когда правильная реакция - вернуться позже.
Приложение не принимает соединения. Все воркеры заняты, пул соединений полон, очередь перед ним на пределе. Сервер впереди всё ещё жив и всё ещё отвечает, поэтому он отвечает единственным честным, что у него есть: не сейчас.
Ограничитель частоты запросов. Вы или сеть, в которой вы находитесь, отправили больше запросов, чем допускает порог. Некоторые сервисы используют для этого код 429, который точнее и полезнее; многие используют 503, а CDN перед приложением часто превращает одно в другое.
Ничего не работает. Автомасштабирование, не поспевшее за всплеском трафика, выкатка, в которой новая версия не прошла health check, контейнер, который умер и не был заменён. Балансировщик нагрузки ищет здоровые цели, куда отправить трафик, не находит ни одной и возвращает 503, потому что отправлять некуда.
Запланировано из этого только первое. Остальные три - это система, говорящая, что она на пределе или что-то потеряла, в той вежливой форме, которая приберегается для временного состояния.
Заголовок, который почти никто не читает
Ошибка 503 - это код состояния, к которому приложен ответ. В ответе может быть Retry-After,
который говорит либо сколько секунд ждать, либо точную дату и время, когда вернуться:
HTTP/1.1 503 Service Unavailable
Retry-After: 120
Content-Type: text/html
Это сайт сообщает вам, что займёт две минуты. Хорошо настроенные страницы обслуживания его выставляют, CDN пропускают его дальше, и отправить его не стоит ничего.
Из этого следуют две вещи, и указывают они в противоположные стороны. Если вы пишете клиент,
читайте заголовок, а не придумывайте собственный backoff: у сервиса, который назвал вам 120
секунд и получает повтор каждые две, просят обслужить ровно те запросы, о которых он только что
сказал, что обслужить их не может. А если сайт держите вы, выставляйте его. Ошибка 503 с
заголовком Retry-After - это поисковик, удерживающий страницу вместо того, чтобы считать её
исчезнувшей, и клиент, который ждёт как надо, а не добавляет к нагрузке, вызвавшей проблему.
Если вы посетитель
Ошибка 503 обычно означает ждать, и, что для ошибки необычно, ожидание часто срабатывает. Перезагрузите страницу через минуту-другую. Если это выкатка или всплеск, всё разрешится само, и в вашем браузере нет ничего, что так или иначе это затрагивает.
Единственное, что стоит проверить, - только ли у вас так. Ошибка 503, которую получают все, - это ёмкость сайта или его окно обслуживания. Ошибка 503, которую получаете вы, а коллега в другой сети нет, - это скорее ограничитель частоты, невзлюбивший ваш адрес, и телефон на мобильном интернете отвечает на этот вопрос секунд за десять. К этому различию целиком и сводится отличить свой баг от их аварии.
Если сайт ваш
Ответ не говорит вам почти ничего, но, в отличие от ошибки 500, причина обычно лежит перед приложением, а не внутри него.
Начните с того, какой слой её выдал. Ошибка 503 от nginx, от балансировщика нагрузки или от CDN выглядит для браузера одинаково и приходит из трёх разных мест с тремя разными журналами. Часто её выдаёт тело ответа, потому что каждый из них везёт собственную страницу по умолчанию, а заголовки ответа обычно называют то, что их произвело. Если ваше приложение так и не запустилось, его журнал будет молчать, и это молчание - улика, а не тупик.
Дальше очевидный вопрос, который легко пропустить, когда сайт лежит: режим обслуживания всё ещё включён? Страница-заглушка, которая должна была продержаться десять минут и пережила выкатку, её поднявшую, - достаточно частая ошибка 503, чтобы проверить это первым делом, а исключается это за секунды.
Если дело в ёмкости, решение не на странице ошибки. Смотрите на загрузку воркеров, лимиты пула и глубину очереди на всём окне, а не на запросы, получившие 503, потому что получившие 503 - это те, что пришли уже после начала проблемы. Если дело в health check, вопрос в том, прав ли он, считая приложение нездоровым, или падает по собственной причине, и эти два случая требуют противоположных действий.
Почему об ошибке 503 стоит сообщать как следует
Большинство ошибок 503 проходят сами. Именно это делает их скользкими: к тому времени, когда кто-то начинает разбираться, сайт снова работает и смотреть не на что. Остаётся чья-то память об одной странице ошибки и догадка о том, когда примерно это было.
Проблемы с ёмкостью и неудачные раскатки не повторяются по требованию. Они случаются в момент, когда трафик пересёк черту, и уликой служит окно на графике, о котором никто не знает, что туда надо смотреть, если только кто-то не записал, когда это произошло.
Session Replay
Бесплатное расширение Chrome. Один клик на странице, которая ведёт себя неправильно, захватывает снимок экрана, консоль и сетевой журнал, и даёт вам ссылку для вставки в задачу.
Для ошибки 503 полезны отметка времени и заголовки ответа: какой слой ответил, какой Retry-After
он заявил, и точная минута. Этого достаточно, чтобы найти нужное окно на дашборде, а именно там
ответ и живёт.
В одном абзаце
Ошибка 503 Service Unavailable означает, что нечто предпочло не обслуживать запрос, вместо того
чтобы попытаться и не справиться, и именно это отделяет её от ошибок 500, 502 и 504. Этот выбор
делают четыре вещи: режим обслуживания, приложение, у которого кончилась ёмкость, ограничитель
частоты запросов и балансировщик нагрузки, которому некуда отправить трафик. Запланирована из них
только первая. Если вы в гостях, подождите минуту, а затем проверьте, видит ли это кто-то ещё.
Если сайт ваш, прежде всего выясните, какой слой ответил, убедитесь, что режим обслуживания
попросту не остался включённым, и выставьте Retry-After, чтобы ждущие клиенты ждали как надо, а
не добавляли к нагрузке.