Приведите конкретный пример из практики, когда вы значительно улучшили производительность REST API.

Ответ

Конечно. Вот пример оптимизации эндпоинта в проекте, похожем на маркетплейс.

Задача: Оптимизировать эндпоинт GET /users/{id}/orders, который возвращал список заказов для конкретного пользователя.

Проблема: Изначальная реализация страдала от проблемы "N+1 запросов". На один запрос к API происходило:

  1. Один запрос к БД для получения данных пользователя.
  2. N запросов к БД в цикле для получения каждого из его заказов.

Это приводило к огромному количеству обращений к базе данных и высокому времени ответа (~1200ms для пользователя со 100 заказами).

Решение (в 3 шага):

  1. Устранение N+1 с помощью JOIN: Запрос был переписан для получения всех необходимых данных за одно обращение к БД. Это позволило избежать цикла и множества запросов.

    -- Вместо множества запросов теперь один
    SELECT o.*, p.name, p.price -- и другие поля заказа и товаров
    FROM orders o
    JOIN order_items oi ON o.id = oi.order_id
    JOIN products p ON oi.product_id = p.id
    WHERE o.user_id = $1;
  2. Добавление пагинации: Чтобы не загружать тысячи заказов одновременно, была добавлена серверная пагинация (LIMIT/OFFSET). Клиент стал получать данные порциями.

    -- Добавляем к запросу выше
    LIMIT $2 OFFSET $3;
  3. Кеширование: Для часто запрашиваемых данных было внедрено кеширование на уровне приложения с использованием Redis. Ответы для активных пользователей кешировались на 1-2 минуты, что еще больше снизило нагрузку на БД.

Результат:

  • Время ответа эндпоинта сократилось с ~1200ms до ~80ms.
  • Нагрузка на базу данных значительно снизилась, что повысило общую стабильность сервиса.