Клиентские приложения под нагрузкой, Андрей Смирнов

48
Клиентские приложения под нагрузкой Андрей Смирнов @smira

Transcript of Клиентские приложения под нагрузкой, Андрей Смирнов

Page 1: Клиентские приложения под нагрузкой, Андрей Смирнов

Клиентские приложения под нагрузкой

Андрей Смирнов@smira

Page 2: Клиентские приложения под нагрузкой, Андрей Смирнов

Backend-разработчик

h,p://www.reddit.com/r/funny/comments/1ecrkg/the_beard_is_as_smooth_as_the_gif/

Высокие нагрузки, сто тысяч запросов в секунду, база данных не справляется…

Что там клиентское приложение делать? Три строчки и всё, а они опять багов насажали…

Page 3: Клиентские приложения под нагрузкой, Андрей Смирнов

Клиентский разработчик

h,p://www.edge-online.com/features/fearing-hipster-developer/

Вышла новая версия SDK, надо проверить на новой модели xPhone.

Опять там в бэкенде кривой API придумали, под нагрузкой падает, а у приложения рейтинг низкий из-за них…

Page 4: Клиентские приложения под нагрузкой, Андрей Смирнов

Продукт = Backend + Приложение

Page 5: Клиентские приложения под нагрузкой, Андрей Смирнов

Приложение =❓Продукт

Page 6: Клиентские приложения под нагрузкой, Андрей Смирнов

Backend =❓Продукт

Page 7: Клиентские приложения под нагрузкой, Андрей Смирнов

СетьПриложение Backend

Page 8: Клиентские приложения под нагрузкой, Андрей Смирнов

Сеть ненадежна

Page 9: Клиентские приложения под нагрузкой, Андрей Смирнов

Ошибки при отправке запроса• Нет сетевого соединения

• Получен ответ с ошибкой сервера

• Таймаут получения ответа

Page 10: Клиентские приложения под нагрузкой, Андрей Смирнов

Неопределенность• Запрос отправлен, ответ не получен:

• Запрос получен сервером и …

• не обработан

• обработан, но с ошибкой

• обработан успешно

• Запрос не получен

h,p://www.trinityp3.com/2014/04/media-agency-rebate-debate/

Page 11: Клиентские приложения под нагрузкой, Андрей Смирнов

Таймауты

Page 12: Клиентские приложения под нагрузкой, Андрей Смирнов

Таймауты

timeout1 > timeout2 > timeout3

Page 13: Клиентские приложения под нагрузкой, Андрей Смирнов

Повтор запроса• Всякий ли запрос можно повторить?

• запрос, не изменяющий состояние

• идемпотентный запрос

• запрос, приводящий к повторному действию

• Можно ли повторить запрос, который привёл к ошибке API?

Page 14: Клиентские приложения под нагрузкой, Андрей Смирнов

Идемпотентность запросов• Создать(Объект) ⇒ ID1

• Создать(Объект) ⇒ ID2

• Не идемпотентен, повторение - создание дубликатов

Page 15: Клиентские приложения под нагрузкой, Андрей Смирнов

ID на клиенте• Создать(ID, объект) ⇒ ОК

• Создать(ID, объект) ⇒ ОК (ничего не делает)

Page 16: Клиентские приложения под нагрузкой, Андрей Смирнов

Отпечаток запроса• Создать(объект) ⇒ отпечаток запроса

• Если запрос уже отправлялся, вернуть предыдущий ответ

• Или выполнить запрос и сохранить ответ по ключу отпечатка запроса

Page 17: Клиентские приложения под нагрузкой, Андрей Смирнов

Прозрачные коды ошибок• Используйте HTTP-коды ошибок

• Ошибки может генерировать не только backend

• Возвращайте дополнительную информацию

Page 18: Клиентские приложения под нагрузкой, Андрей Смирнов

Сетевое взаимодействие• Используйте HTTP(S), Keep-Alive, Pipelining

• WebSocket для двунаправленного взаимодействия

• Не используйте polling

• Используйте push notifications

• На мобильных устройствах: берегите батарею и радиоканал

Page 19: Клиентские приложения под нагрузкой, Андрей Смирнов

Клиент - это DDoS

Page 20: Клиентские приложения под нагрузкой, Андрей Смирнов

Причины• Баги в коде

• Поведение сети

• Клиентское окружение

• Авария на стороне сервера

Page 21: Клиентские приложения под нагрузкой, Андрей Смирнов

Особенности• Нельзя отправить в /dev/null

• Одновременное обновление версий ПО

• Выкатить исправленную версию быстро не всегда возможно

Page 22: Клиентские приложения под нагрузкой, Андрей Смирнов

Как избежать?• Тестирование в реальной среде

• Rate limiting

Page 23: Клиентские приложения под нагрузкой, Андрей Смирнов

Нагрузка и время откликаотклик

, сек

0,1

1

10

100

нагрузка, запросов/сек

1000 2000 3000 4000 5000 6000 7000

Page 24: Клиентские приложения под нагрузкой, Андрей Смирнов

Нагрузка и время откликаотклик

, сек

0,1

1

10

100

нагрузка, запросов/сек

1000 2000 3000 4000 5000 6000 7000

Page 25: Клиентские приложения под нагрузкой, Андрей Смирнов

Нагрузка и время откликаотклик

, сек

0,1

1

10

100

нагрузка, запросов/сек

1000 2000 3000 4000 5000 6000 7000

Page 26: Клиентские приложения под нагрузкой, Андрей Смирнов

Нагрузка и время откликаотклик

, сек

0,1

1

10

100

нагрузка, запросов/сек

1000 2000 3000 4000 5000 6000 7000

Page 27: Клиентские приложения под нагрузкой, Андрей Смирнов

Нагрузка и время откликаотклик

, сек

0,1

1

10

100

нагрузка, запросов/сек

1000 2000 3000 4000 5000 6000 7000

Page 28: Клиентские приложения под нагрузкой, Андрей Смирнов

Нагрузка и время откликаотклик

, сек

0,1

1

10

100

нагрузка, запросов/сек

1000 2000 3000 4000 5000 6000 7000

Page 29: Клиентские приложения под нагрузкой, Андрей Смирнов

• Повтор через фиксированный интервал

• Экспоненциальное откладывание

Алгоритм повтора

D = min(D ⋅F,Dmax )D = D + NormVariate(0,D ⋅ J )F = 1.7, J = 0.1

Page 30: Клиентские приложения под нагрузкой, Андрей Смирнов

Экспоненциальное откладываниезадерж

ка, секунды

0

150

300

450

600

номер попытки

1 2 3 4 5 6 7 8 9

Page 31: Клиентские приложения под нагрузкой, Андрей Смирнов

Синхронизация данных

Page 32: Клиентские приложения под нагрузкой, Андрей Смирнов

Мгновенный отклик

Page 33: Клиентские приложения под нагрузкой, Андрей Смирнов

Работа в offline-режиме

Page 34: Клиентские приложения под нагрузкой, Андрей Смирнов

Схема клиентского приложения

Page 35: Клиентские приложения под нагрузкой, Андрей Смирнов

Конфликты• Обнаружение конфликтов

• Стратегии борьбы с конфликтами:

• Уменьшение размера изменений

• Слияние изменений

• “Последний побеждает”

Page 36: Клиентские приложения под нагрузкой, Андрей Смирнов

CRDT• Fa(Fb(X)) = Fb(Fa(X))

• Счетчики

• Множества

• “Последний побеждает”

Page 37: Клиентские приложения под нагрузкой, Андрей Смирнов

Клиент как веб-сервис

Page 38: Клиентские приложения под нагрузкой, Андрей Смирнов

Асимметричность• Приложение может обращаться к backend

• А backend к приложению?

• Web Socket

• Push Notifications

• …

Page 39: Клиентские приложения под нагрузкой, Андрей Смирнов
Page 40: Клиентские приложения под нагрузкой, Андрей Смирнов

Приложение ≈ Backend

Page 41: Клиентские приложения под нагрузкой, Андрей Смирнов

Backend является клиентом• Backend⇛БД

• Backend⇛Backend (SOA)

• Backend⇛Внешний сервис

• Backend⇛Клиент

Page 42: Клиентские приложения под нагрузкой, Андрей Смирнов

Клиент является backendом• Хранение данных

• “CAP”-теорема при синхронизации

• Мощная среда исполнения

Page 43: Клиентские приложения под нагрузкой, Андрей Смирнов

Спасибо! Вопросы?• Андрей Смирнов

• @smira

[email protected]

• h,p://smira.ru/

Page 44: Клиентские приложения под нагрузкой, Андрей Смирнов

Конфигурация• Независимость от основной серверной инфраструктуры

• Включение/отключение функций

• A/B тестирование

• Изменение параметров

• Применение параметров для части пользователей

Page 45: Клиентские приложения под нагрузкой, Андрей Смирнов

Мониторинг на стороне backend• Сбор данных об активности клиента

• Поиск и агрегация по параметрам клиентского приложения, пользователя, сессии и т.п.

Page 46: Клиентские приложения под нагрузкой, Андрей Смирнов

Отслеживание crashей• Когда и сколько раз произошел сбой?

• Какая версия приложения? Какая платформа?

• Какие сбои самые частые?

Page 47: Клиентские приложения под нагрузкой, Андрей Смирнов

Сбор метрик• Производительность приложения

• Сетевые метрики (по типу сети, географическому признаку)

• Пользовательская база

• Дополнительные метрики (UX)

Page 48: Клиентские приложения под нагрузкой, Андрей Смирнов

SaaS-решения• Crashlytics

• Cri,ercism

• New Relic

• AirBrake

• …