Какие техники и паттерны используются для снижения сетевой нагрузки и количества запросов в бэкенд-системах?

Ответ

Для снижения сетевой нагрузки и уменьшения числа запросов применяются различные подходы на уровне кода, архитектуры и протоколов.

На уровне приложения и кода:

  1. Кеширование (Caching): Хранение часто запрашиваемых данных в быстрой памяти (In-memory кеш, Redis, Memcached) для избежания повторных обращений к медленным источникам (БД, внешние API).

  2. Пул соединений (Connection Pooling): Переиспользование установленных сетевых соединений (например, к базе данных) вместо создания новых на каждый запрос. Это значительно снижает задержки, связанные с TCP и TLS хендшейками. В Go database/sql делает это автоматически.

  3. Пакетная обработка (Batching): Объединение множества мелких операций в один крупный запрос. Например, вместо 100 отдельных INSERT выполнить один INSERT со 100 строками.

  4. Ограничение частоты запросов (Rate Limiting): Защита сервиса от перегрузки путем ограничения количества запросов от одного клиента за определенный промежуток времени. В Go для этого есть отличная библиотека golang.org/x/time/rate.

    import "golang.org/x/time/rate"
    import "time"
    
    limiter := rate.NewLimiter(rate.Every(time.Second), 10) // 10 запросов в секунду
    if !limiter.Allow() {
        // Ответить ошибкой 429 Too Many Requests
    }

На уровне архитектуры и протоколов:

  1. GraphQL: Позволяет клиенту запрашивать только те данные, которые ему нужны, одним запросом. Это решает проблему избыточной (over-fetching) и недостаточной (under-fetching) выборки данных, характерную для REST API.

  2. gRPC: Фреймворк для удаленного вызова процедур, использующий HTTP/2 и Protocol Buffers. Бинарный формат Protobuf гораздо компактнее JSON, а HTTP/2 поддерживает мультиплексирование запросов через одно TCP-соединение, что снижает накладные расходы.

  3. WebSockets или Server-Sent Events (SSE): Для real-time коммуникаций используются постоянные соединения. Это избавляет от необходимости постоянно опрашивать сервер на наличие обновлений (polling), что резко снижает количество HTTP-запросов.