Ошибка 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, чтобы ждущие клиенты ждали как надо, а не добавляли к нагрузке.