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

Post on 22-Jun-2015

4.827 Views

Category:

Internet

1 Downloads

Preview:

Click to see full reader

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

• me@smira.ru

• h,p://smira.ru/

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

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

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

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

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

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

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

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

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

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

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

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

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

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

SaaS-решения• Crashlytics

• Cri,ercism

• New Relic

• AirBrake

• …

top related