Что означает HTTP-ошибка 503 Service Unavailable?

«Что означает HTTP-ошибка 503 Service Unavailable?» — вопрос из категории HTTP и веб-протоколы, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

HTTP-ошибка 503 Service Unavailable (Сервис недоступен) — это код ответа сервера, указывающий, что сервер временно не может обработать запрос из-за перегрузки или плановых технических работ. В отличие от 500, эта ошибка обычно свидетельствует о временной ситуации.

Основные причины:

  • Высокая нагрузка: Пиковое количество запросов, превышающее возможности сервера.
  • Техническое обслуживание: Плановый апдейт, миграция данных, перезапуск сервисов.
  • Проблемы с инфраструктурой: Сбой балансировщика нагрузки, проблемы с сетевым оборудованием.
  • Зависимости недоступны: Критически важный внешний сервис или база данных не отвечает.

Важный атрибут ответа: Сервер может (и должен) включить заголовок Retry-After, который указывает клиенту, через сколько секунд или до какой даты можно повторить запрос.

Пример HTTP-ответа:

HTTP/1.1 503 Service Unavailable
Retry-After: 300  # Повторить через 300 секунд (5 минут)
Content-Type: application/json

{
  "status": "maintenance",
  "message": "The service is undergoing scheduled maintenance.",
  "estimated_recovery_time": "2023-10-27T12:00:00Z"
}

Обработка на стороне клиента (Python с requests):

import requests
import time

def make_request_with_retry(url, max_retries=3):
    for attempt in range(max_retries):
        try:
            response = requests.get(url, timeout=10)
            if response.status_code == 503:
                retry_after = response.headers.get('Retry-After')
                wait_time = int(retry_after) if retry_after and retry_after.isdigit() else (2 ** attempt)  # exponential backoff
                print(f"Service unavailable. Retrying in {wait_time} seconds...")
                time.sleep(wait_time)
                continue
            response.raise_for_status()  # Проверяет другие ошибки 4xx/5xx
            return response.json()
        except requests.exceptions.RequestException as e:
            print(f"Request failed: {e}")
            if attempt == max_retries - 1:
                raise
            time.sleep(2 ** attempt)
    return None

Что делать при получении 503:

  1. Для клиента: Следовать указанию Retry-After или использовать стратегию повторных попыток с экспоненциальной задержкой.
  2. Для администратора/разработчика:
    • Проверить метрики нагрузки (CPU, память, сетевой трафик).
    • Убедиться, что все компоненты инфраструктуры работают.
    • Если ведется техобслуживание — убедиться, что оно проходит по плану.