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

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

  • Upload
    ontico

  • View
    22.136

  • Download
    7

Embed Size (px)

Citation preview

Дизайн 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• Кэшируем правильно• Не совершаем простых ошибок

Спасибо! Вопросы?

Контакты

[email protected]

https://www.linkedin.com/in/alexlebedev

https://github.com/alebedev