Дизайн rest api для высокопроизводительных систем /...
TRANSCRIPT
О чем этот рассказ
• Взгляд фронтенд-разработчика• С каким REST API удобно писать быстрые приложения• И какой API мешает это делать
Общий подход к производительности
• Смотрим на систему в целом• Измерение важнее оптимизации• Избегаем простых ошибок
Как измерять производительность
• Нагружаем REST API для проверки бэкенда• Нагружаем UI для проверки фронтенда
Условия измерения производительности
Картина, максимально приближенная к жизни• Данные• Количество пользователей• Сценарии использования
Измеряем производительность бэкенда дешево и сердито• Перекладываем use cases в список REST-запросов• Выполняем через JMeter• Profilt!
Измеряем производительность веб-фронтенда дешево и сердито• console.time() / console.timeEnd()• window.performance.now()• Selenium для автоматизации
Pagination — подсчёт результатов
Пример стоимости получения• Данные для 20 элементов: 0.12 с• “результаты 1..20 из 1024”: 0.45 с
Pagination — сухой остаток
• Иногда уместно• Часто есть UI/UX-решения получше• Думайте о производительности• Думайте о кэшировании
Проблема N+1 — причины и решения
Причины• Проектирование API без мыслей об UI• Проектирование UI без мыслей об API
Решения• Включать все данные в один запрос• Убрать из списка то, что нельзя получить сразу
Лишние данные — возможные решения
• Краткая и полная версии объектов в API• Клиент указывает в запросе, какие данные нужны
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• Кэшируем правильно• Не совершаем простых ошибок
Контакты
https://www.linkedin.com/in/alexlebedev
https://github.com/alebedev