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

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

Upload: andrey-smirnov

Post on 22-Jun-2015

4.827 views

Category:

Internet


1 download

DESCRIPTION

"Что там писать клиентское приложение - вот сервер, который выдерживает 10 тысяч запросов в секунду!"... "Да они там только API делают, вот бы хоть одно приложение под iOS написали!" Подобный обмен претензиями частенько можно услышать в спорах клиентских и серверных разработчиков. В этом докладе я попробую примирить обе стороны. Только от успешного взаимодействия клиентского приложения и серверной части зависит успех высоконагруженного проекта в целом. * Как сделать так, чтобы клиент не "завалил" сервер? * Коммуникация ошибок от сервера к клиенту. * Синхронизация, разрешение конфликтов. * Работа в offline-режиме. * Разработка эффективного и корректного API. * Асинхронное взаимодействие. * Почему клиент и сервер на самом деле очень похожи?

TRANSCRIPT

Page 1: Клиентские приложения под нагрузкой (HighLoad 2014)

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

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

Page 2: Клиентские приложения под нагрузкой (HighLoad 2014)

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

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

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

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

Page 3: Клиентские приложения под нагрузкой (HighLoad 2014)

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

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

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

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

Page 4: Клиентские приложения под нагрузкой (HighLoad 2014)

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

Page 5: Клиентские приложения под нагрузкой (HighLoad 2014)

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

Page 6: Клиентские приложения под нагрузкой (HighLoad 2014)

Backend =❓Продукт

Page 7: Клиентские приложения под нагрузкой (HighLoad 2014)

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

Page 8: Клиентские приложения под нагрузкой (HighLoad 2014)

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

Page 9: Клиентские приложения под нагрузкой (HighLoad 2014)

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

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

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

Page 10: Клиентские приложения под нагрузкой (HighLoad 2014)

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

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

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

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

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

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

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

Page 11: Клиентские приложения под нагрузкой (HighLoad 2014)

Таймауты

Page 12: Клиентские приложения под нагрузкой (HighLoad 2014)

Таймауты

timeout1 > timeout2 > timeout3

Page 13: Клиентские приложения под нагрузкой (HighLoad 2014)

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

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

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

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

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

Page 14: Клиентские приложения под нагрузкой (HighLoad 2014)

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

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

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

Page 15: Клиентские приложения под нагрузкой (HighLoad 2014)

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

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

Page 16: Клиентские приложения под нагрузкой (HighLoad 2014)

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

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

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

Page 17: Клиентские приложения под нагрузкой (HighLoad 2014)

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

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

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

Page 18: Клиентские приложения под нагрузкой (HighLoad 2014)

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

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

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

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

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

Page 19: Клиентские приложения под нагрузкой (HighLoad 2014)

Клиент - это DDoS

Page 20: Клиентские приложения под нагрузкой (HighLoad 2014)

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

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

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

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

Page 21: Клиентские приложения под нагрузкой (HighLoad 2014)

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

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

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

Page 22: Клиентские приложения под нагрузкой (HighLoad 2014)

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

• Rate limiting

Page 23: Клиентские приложения под нагрузкой (HighLoad 2014)

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

, сек

0,1

1

10

100

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

1000 2000 3000 4000 5000 6000 7000

Page 24: Клиентские приложения под нагрузкой (HighLoad 2014)

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

, сек

0,1

1

10

100

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

1000 2000 3000 4000 5000 6000 7000

Page 25: Клиентские приложения под нагрузкой (HighLoad 2014)

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

, сек

0,1

1

10

100

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

1000 2000 3000 4000 5000 6000 7000

Page 26: Клиентские приложения под нагрузкой (HighLoad 2014)

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

, сек

0,1

1

10

100

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

1000 2000 3000 4000 5000 6000 7000

Page 27: Клиентские приложения под нагрузкой (HighLoad 2014)

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

, сек

0,1

1

10

100

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

1000 2000 3000 4000 5000 6000 7000

Page 28: Клиентские приложения под нагрузкой (HighLoad 2014)

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

, сек

0,1

1

10

100

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

1000 2000 3000 4000 5000 6000 7000

Page 29: Клиентские приложения под нагрузкой (HighLoad 2014)

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

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

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

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

Page 30: Клиентские приложения под нагрузкой (HighLoad 2014)

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

ка, секунды

0

150

300

450

600

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

1 2 3 4 5 6 7 8 9

Page 31: Клиентские приложения под нагрузкой (HighLoad 2014)

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

Page 32: Клиентские приложения под нагрузкой (HighLoad 2014)

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

Page 33: Клиентские приложения под нагрузкой (HighLoad 2014)

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

Page 34: Клиентские приложения под нагрузкой (HighLoad 2014)

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

Page 35: Клиентские приложения под нагрузкой (HighLoad 2014)

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

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

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

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

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

Page 36: Клиентские приложения под нагрузкой (HighLoad 2014)

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

• Счетчики

• Множества

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

Page 37: Клиентские приложения под нагрузкой (HighLoad 2014)

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

Page 38: Клиентские приложения под нагрузкой (HighLoad 2014)

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

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

• Web Socket

• Push Notifications

• …

Page 39: Клиентские приложения под нагрузкой (HighLoad 2014)
Page 40: Клиентские приложения под нагрузкой (HighLoad 2014)

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

Page 41: Клиентские приложения под нагрузкой (HighLoad 2014)

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

• Backend⇛Backend (SOA)

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

• Backend⇛Клиент

Page 42: Клиентские приложения под нагрузкой (HighLoad 2014)

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

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

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

Page 43: Клиентские приложения под нагрузкой (HighLoad 2014)

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

• @smira

[email protected]

• h,p://smira.ru/

Page 44: Клиентские приложения под нагрузкой (HighLoad 2014)

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

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

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

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

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

Page 45: Клиентские приложения под нагрузкой (HighLoad 2014)

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

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

Page 46: Клиентские приложения под нагрузкой (HighLoad 2014)

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

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

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

Page 47: Клиентские приложения под нагрузкой (HighLoad 2014)

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

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

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

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

Page 48: Клиентские приложения под нагрузкой (HighLoad 2014)

SaaS-решения• Crashlytics

• Cri,ercism

• New Relic

• AirBrake

• …