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