Что происходит с сервисом при перегрузке запросами (high load)?

«Что происходит с сервисом при перегрузке запросами (high load)?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Поведение зависит от архитектуры и настроек сервиса. Без защитных механизмов последствия каскадируются:

  1. Деградация производительности: Увеличивается время отклика (latency) из-за очередей в пулах потоков и соединений БД.
  2. Исчерпание ресурсов:
    • Память (OOM Error): При большом количестве параллельных запросов.
    • Соединения: Пулы БД, HTTP-клиентов исчерпываются.
    • ЦПУ: Нагрузка достигает 100%.
  3. Полный отказ: Сервис перестает отвечать (падение) или возвращает ошибки (например, HTTP 503 Service Unavailable).

Стратегии защиты (Resilience Patterns):

  • Rate Limiting (Ограничение частоты): Отклонение избыточных запросов.
    // Псевдокод с Bucket4j
    Bucket bucket = Bucket.builder().addLimit(limit -> 1000req/1min).build();
    if (bucket.tryConsume(1)) {
        processRequest();
    } else {
        return "429 Too Many Requests";
    }
  • Автомасштабирование (Auto-scaling): Добавление инстансов под нагрузкой (Kubernetes HPA, облачные провайдеры).
  • Асинхронная обработка и очереди: Помещение запросов в очередь (Kafka, RabbitMQ) для обработки в фоне.
  • Кеширование: Разгрузка бэкенда с помощью Redis или Memcached.
  • Circuit Breaker: Временная остановка запросов к нездоровому зависимому сервису.