Производительность API и кэширование
Производительность API и кэширование снижают задержки, увеличивают пропускную способность и экономят ресурсы бэкенда за счёт переиспользования ответов и вычислений.
Краткое описание
Производительность API описывает, насколько быстро и эффективно API обрабатывает запросы. Ключевые метрики: задержка, пропускная способность и частота ошибок. Кэширование — один из самых действенных способов улучшить производительность, сохраняя уже вычисленные или полученные данные. Кэширование может происходить на разных уровнях: в браузере, в CDN, в API Gateway, на сервере приложений или в БД. HTTP предоставляет стандартизированные заголовки кэша: Cache-Control, ETag, Last-Modified и Expires. Серверные кэши вроде Redis или Memcached хранят часто используемые данные в памяти. Продуманная стратегия кэширования учитывает длительность кэша, инвалидацию, консистентность и выбор нужного уровня кэша. Оптимизация производительности также включает индексы БД, пагинацию, асинхронность, сжатие, балансировку нагрузки и эффективную сериализацию.
Ключевые компоненты
Задержка и пропускная способность
Задержка — это время, прошедшее от отправки запроса до получения ответа. Пропускная способность — количество запросов, которые API может обработать в единицу времени. Хорошая производительность API означает низкую задержку, высокую пропускную способность и стабильную частоту ошибок.
HTTP-заголовки кэша
Cache-Control — самый важный HTTP-заголовок для кэширования. Он задаёт правила вроде max-age, no-cache, no-store, private или public. ETag и Last-Modified позволяют делать условные запросы с If-None-Match и If-Modified-Since. Сервер может ответить 304 Not Modified для неизменённых данных, не отправляя тело ответа заново.
Кэш браузера
Браузеры кэшируют ответы на основе HTTP-заголовков кэша. Это снижает сетевой трафик и улучшает время загрузки для повторяющихся запросов. Для конфиденциальных данных используйте private или no-store, чтобы браузер ничего не сохранял.
Кэширование в CDN
Content Delivery Networks кэшируют ответы API или статический контент на географически распределённых узлах. Это снижает задержку для пользователей по всему миру и разгружает серверы бэкенда. CDN особенно подходит для открытых, часто запрашиваемых данных.
Кэш в API Gateway
API Gateway может кэшировать ответы перед отправкой их бэкенд-сервисам. Это снижает нагрузку на бэкенд и время ответа. Gateway проверяет заголовки кэша, Rate Limits и аутентификацию прежде, чем пропустить запрос в кэш или на бэкенд.
Серверный кэш
Серверные кэши вроде Redis или Memcached хранят данные в памяти. Они используются, чтобы избежать запросов к БД, дорогостоящих вычислений или вызовов внешних API. Кэшами можно управлять через TTL, инвалидацию или Cache-Aside Pattern.
Cache-Aside Pattern
В Cache-Aside Pattern приложение сначала проверяет кэш. Если данные отсутствуют, они загружаются из БД и сохраняются в кэш. При обновлениях кэш инвалидируется или обновляется. Этот паттерн гибкий и широко распространён.
ETag и условные запросы
ETag — значение, которое представляет версию ресурса. При повторном запросе клиент отправляет ETag в заголовке If-None-Match. Если ресурс не изменился, сервер отвечает 304 Not Modified. Это экономит пропускную способность и время обработки.
Инвалидация кэша
Инвалидация кэша — задача поддерживать кэш в актуальном состоянии. Стратегии: истечение по TTL, явная инвалидация при записи, Write-Through Caching и инвалидация на основе событий. Неправильная инвалидация приводит к устаревшим данным.
Пагинация и объём данных
Большие ответы увеличивают задержку и расход памяти. Пагинация, фильтры и сортировка ограничивают объём возвращаемых данных. Клиенты должны получать только нужные им данные.
Оптимизация БД
Медленные запросы к БД часто становятся узким местом производительности API. Индексы, оптимизированные запросы, денормализация, кэширование и Connection Pooling улучшают время ответа. Долгие запросы следует обрабатывать асинхронно или с пагинацией.
Сжатие
Сжатие с gzip или Brotli уменьшает размер тела ответа, особенно для JSON. Современные серверы и клиенты поддерживают сжатие по умолчанию. Заголовок Accept-Encoding сигнализирует поддерживаемые методы.
Практический пример
API данных о товарах использует несколько уровней кэширования для улучшения производительности.
Конфигурация кэша для открытых данных товара:
GET /api/v1/products/42
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: public, max-age=3600
ETag: "abc123"
{
"id": 42,
"name": "Laptop",
"price": 999
}
При повторном запросе клиент отправляет:
GET /api/v1/products/42
If-None-Match: "abc123"
Если товар не изменился, сервер отвечает:
HTTP/1.1 304 Not Modified
Со стороны сервера товар дополнительно сохраняется в Redis с TTL в один час. При изменении цены инвалидируется кэш Redis и CDN, чтобы клиенты получили свежие данные.
FAQ: Производительность API и кэширование
1. Что такое производительность API?
2. Что такое кэширование?
3. Что такое Cache-Control?
4. Что такое ETag?
5. Что такое CDN?
6. Что такое Redis?
7. Что такое Cache-Aside Pattern?
8. Что такое 304 Not Modified?
9. Что такое инвалидация кэша?
10. Что такое Write-Through Caching?
11. Что такое TTL?
12. Что такое private vs public кэширование?
13. Что такое no-store?
14. Что такое сжатие в API?
15. Какие best practices для кэширования API?
Источники
- https://www.rfc-editor.org/rfc/rfc9111
- https://redis.io/docs/manual/keyspace-notifications/
- https://developer.mozilla.org/docs/Web/HTTP/Caching
Рекомендуемые книги по производительности и архитектуре API
Если хочешь глубже разобраться в производительности API, кешировании и проектировании систем, вот несколько полезных книг:
Keine Bücher für Kategorie "software-engineering" gefunden.



