Клиентские приложения под нагрузкой (highload 2014)
DESCRIPTION
"Что там писать клиентское приложение - вот сервер, который выдерживает 10 тысяч запросов в секунду!"... "Да они там только API делают, вот бы хоть одно приложение под iOS написали!" Подобный обмен претензиями частенько можно услышать в спорах клиентских и серверных разработчиков. В этом докладе я попробую примирить обе стороны. Только от успешного взаимодействия клиентского приложения и серверной части зависит успех высоконагруженного проекта в целом. * Как сделать так, чтобы клиент не "завалил" сервер? * Коммуникация ошибок от сервера к клиенту. * Синхронизация, разрешение конфликтов. * Работа в offline-режиме. * Разработка эффективного и корректного API. * Асинхронное взаимодействие. * Почему клиент и сервер на самом деле очень похожи?TRANSCRIPT
Клиентские приложения под нагрузкой
Андрей Смирнов@smira
Backend-разработчик
h,p://www.reddit.com/r/funny/comments/1ecrkg/the_beard_is_as_smooth_as_the_gif/
Высокие нагрузки, сто тысяч запросов в секунду, база данных не справляется…
Что там клиентское приложение делать? Три строчки и всё, а они опять багов насажали…
Клиентский разработчик
h,p://www.edge-online.com/features/fearing-hipster-developer/
Вышла новая версия SDK, надо проверить на новой модели xPhone.
Опять там в бэкенде кривой API придумали, под нагрузкой падает, а у приложения рейтинг низкий из-за них…
Продукт = Backend + Приложение
Приложение =❓Продукт
Backend =❓Продукт
СетьПриложение Backend
Сеть ненадежна
Ошибки при отправке запроса• Нет сетевого соединения
• Получен ответ с ошибкой сервера
• Таймаут получения ответа
Неопределенность• Запрос отправлен, ответ не получен:
• Запрос получен сервером и …
• не обработан
• обработан, но с ошибкой
• обработан успешно
• Запрос не получен
h,p://www.trinityp3.com/2014/04/media-agency-rebate-debate/
Таймауты
Таймауты
timeout1 > timeout2 > timeout3
Повтор запроса• Всякий ли запрос можно повторить?
• запрос, не изменяющий состояние
• идемпотентный запрос
• запрос, приводящий к повторному действию
• Можно ли повторить запрос, который привёл к ошибке API?
Идемпотентность запросов• Создать(Объект) ⇒ ID1
• Создать(Объект) ⇒ ID2
• Не идемпотентен, повторение - создание дубликатов
ID на клиенте• Создать(ID, объект) ⇒ ОК
• Создать(ID, объект) ⇒ ОК (ничего не делает)
Отпечаток запроса• Создать(объект) ⇒ отпечаток запроса
• Если запрос уже отправлялся, вернуть предыдущий ответ
• Или выполнить запрос и сохранить ответ по ключу отпечатка запроса
Прозрачные коды ошибок• Используйте HTTP-коды ошибок
• Ошибки может генерировать не только backend
• Возвращайте дополнительную информацию
Сетевое взаимодействие• Используйте HTTP(S), Keep-Alive, Pipelining
• WebSocket для двунаправленного взаимодействия
• Не используйте polling
• Используйте push notifications
• На мобильных устройствах: берегите батарею и радиоканал
Клиент - это DDoS
Причины• Баги в коде
• Поведение сети
• Клиентское окружение
• Авария на стороне сервера
Особенности• Нельзя отправить в /dev/null
• Одновременное обновление версий ПО
• Выкатить исправленную версию быстро не всегда возможно
Как избежать?• Тестирование в реальной среде
• Rate limiting
Нагрузка и время откликаотклик
, сек
0,1
1
10
100
нагрузка, запросов/сек
1000 2000 3000 4000 5000 6000 7000
Нагрузка и время откликаотклик
, сек
0,1
1
10
100
нагрузка, запросов/сек
1000 2000 3000 4000 5000 6000 7000
Нагрузка и время откликаотклик
, сек
0,1
1
10
100
нагрузка, запросов/сек
1000 2000 3000 4000 5000 6000 7000
Нагрузка и время откликаотклик
, сек
0,1
1
10
100
нагрузка, запросов/сек
1000 2000 3000 4000 5000 6000 7000
Нагрузка и время откликаотклик
, сек
0,1
1
10
100
нагрузка, запросов/сек
1000 2000 3000 4000 5000 6000 7000
Нагрузка и время откликаотклик
, сек
0,1
1
10
100
нагрузка, запросов/сек
1000 2000 3000 4000 5000 6000 7000
• Повтор через фиксированный интервал
• Экспоненциальное откладывание
Алгоритм повтора
D = min(D ⋅F,Dmax )D = D + NormVariate(0,D ⋅ J )F = 1.7, J = 0.1
Экспоненциальное откладываниезадерж
ка, секунды
0
150
300
450
600
номер попытки
1 2 3 4 5 6 7 8 9
Синхронизация данных
Мгновенный отклик
Работа в offline-режиме
Схема клиентского приложения
Конфликты• Обнаружение конфликтов
• Стратегии борьбы с конфликтами:
• Уменьшение размера изменений
• Слияние изменений
• “Последний побеждает”
CRDT• Fa(Fb(X)) = Fb(Fa(X))
• Счетчики
• Множества
• “Последний побеждает”
Клиент как веб-сервис
Асимметричность• Приложение может обращаться к backend
• А backend к приложению?
• Web Socket
• Push Notifications
• …
Приложение ≈ Backend
Backend является клиентом• Backend⇛БД
• Backend⇛Backend (SOA)
• Backend⇛Внешний сервис
• Backend⇛Клиент
Клиент является backendом• Хранение данных
• “CAP”-теорема при синхронизации
• Мощная среда исполнения
Спасибо! Вопросы?• Андрей Смирнов
• @smira
• h,p://smira.ru/
Конфигурация• Независимость от основной серверной инфраструктуры
• Включение/отключение функций
• A/B тестирование
• Изменение параметров
• Применение параметров для части пользователей
Мониторинг на стороне backend• Сбор данных об активности клиента
• Поиск и агрегация по параметрам клиентского приложения, пользователя, сессии и т.п.
Отслеживание crashей• Когда и сколько раз произошел сбой?
• Какая версия приложения? Какая платформа?
• Какие сбои самые частые?
Сбор метрик• Производительность приложения
• Сетевые метрики (по типу сети, географическому признаку)
• Пользовательская база
• Дополнительные метрики (UX)
SaaS-решения• Crashlytics
• Cri,ercism
• New Relic
• AirBrake
• …