Дизайн REST API для
высокопроизводительных
систем
Александр Лебедев
Новые Облачные Технологии
О чем этот рассказ
• Взгляд фронтенд-разработчика
• С каким REST API удобно писать быстрые приложения
• И какой API мешает это делать
Почему это важно
• Performance
• Скорость разработки
***
Контекст
Система с высоты птичьего полета
Люди с высоты птичьего полета
Общий подход к производительности
• Смотрим на систему в целом
• Измерение важнее оптимизации
• Избегаем простых ошибок
***
Измерение производительности
Как измерять производительность
• Нагружаем REST API для проверки бэкенда
• Нагружаем UI для проверки фронтенда
Условия измерения производительности
Картина, максимально приближенная к жизни
• Данные
• Количество пользователей
• Сценарии использования
Измеряем производительность бэкенда
дешево и сердито
• Перекладываем use cases в список REST-запросов
• Выполняем через JMeter
• Profilt!
Измеряем производительность веб-
фронтенда дешево и сердито
• console.time() / console.timeEnd()
• window.performance.now()
• Selenium для автоматизации
***
Паттерны и антипаттерны
Прозрачность стоимости запроса
Прозрачность стоимости запроса
Прозрачность стоимости запроса
Прозрачность стоимости запроса
Прозрачность стоимости запроса
***
Pagination
• Дешево и сердито
• Но есть проблемы
Pagination — подсчёт результатов
Пример стоимости получения
• Данные для 20 элементов: 0.12 с
• “результаты 1..20 из 1024”: 0.45 с
Pagination и Usability
• Когда вы последний раз ходили на вторую страницу Гугла?
Pagination и синхронизация
• А что, если список поменяется между запросами страниц?
Pagination — сухой остаток
• Иногда уместно
• Часто есть UI/UX-решения получше
• Думайте о производительности
• Думайте о кэшировании
***
Проблема N+1
• REST API здорового человека: 1 запрос
Проблема N+1
• REST API здорового человека: 1 запрос
• REST API курильщика: 11 запросов (N+1)
Проблема N+1 — причины и решения
Причины
• Проектирование API без мыслей об UI
• Проектирование UI без мыслей об API
Решения
• Включать все данные в один запрос
• Убрать из списка то, что нельзя получить сразу
***
Лишние данные
• Используется: 20Kb
• Загружено: 400Kb
Лишние данные — возможные решения
• Краткая и полная версии объектов в API
• Клиент указывает в запросе, какие данные нужны
***
Кэширование
• Сервер (за рамками доклада)
• HTTP
• Клиент
HTTP-кэш — плюсы и минусы
• Общепринятый стандарт
• Уже готово на сервере и на клиенте
• Не кастомизируется программно
• Инвалидация — обязательный поход по сети
HTTP-кэш — что обязан знать разработчик
• Cache-control, Expires
• Conditional GET
• Cache busting
• Стабильные id
Клиентский кэш — плюсы и минусы
• Максимально гибко и быстро
• Но надо писать код
• И придумывать решения
• Дублирование логики на всех клиентах
Клиентский кэш — как делать
• _.memoize()
• Кэширующий REST client
• Самодельный программный кэш
• In-memory DB
Клиентский кэш — как делать
• _.memoize() — да
• Кэширующий REST client
• Самодельный программный кэш
• In-memory DB
Клиентский кэш — как делать
• _.memoize() — да
• Кэширующий REST client — нет
• Самодельный программный кэш
• In-memory DB
Клиентский кэш — как делать
• _.memoize() — да
• Кэширующий REST client — нет
• Самодельный программный кэш — да
• In-memory DB
Клиентский кэш — как делать
• _.memoize() — да
• Кэширующий REST client — нет
• Самодельный программный кэш — да
• In-memory DB — да
Клиентский кэш — как инвалидировать
• Таймауты
• События в интерфейсе
• Уведомления с сервера
Клиентский кэш — как инвалидировать
• Таймауты
• События в интерфейсе
• Уведомления с сервера
Источник истины только на сервере!
***
Что еще мешает писать быстрый фронтенд
• Зависимость запросов друг от друга
• Не-JSON данные
• Нарушение семантики HTTP
• Разные ответы на один запрос
• Изменение данных через GET
• Изменение URL стабильных данных
***
Подводим итоги
Резюме
• Проектируем REST API вместе и для всех
• Измерение скорости важнее оптимизации
• Не скрываем стоимость операций
• Отталкиваемся от структуры UI
• Кэшируем правильно
• Не совершаем простых ошибок
Спасибо! Вопросы?
Контакты
alexander.lebedev@ncloudtech.ru
https://www.linkedin.com/in/alexlebedev
https://github.com/alebedev

Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые Облачные Технологии)