Все о бекенде мобильных приложений badoo
Post on 16-Jul-2015
675 Views
Preview:
TRANSCRIPT
Все о бекенде мобильных приложений Badoo
Крапивный Николай
Badoo
1 / 35
— проект для поиска новых знакомств
— более 200М активных пользователей изо всех стран мира
— более 10М DAU
— 2½ датацентра, более 3к серверов, более 120 инженеров
— до 50к динамических RPS в пиках
Обо мне
2 / 35
— работаю в Feature team
— поддерживаем весь продуктовый функционал со стороны php
— реализуем самые извращенные мечты продуктовой команды
— и web и mobile
О чем доклад
3 / 35
— обо всём понемногу
— наши проблемы - наша боль
— технические подробности - лично
Продукт
4 / 35
X
WEB
= 12Badoo
Hotornot
Blendr
Как жить?
5 / 35
Протокол
6 / 35
Протокол: Protobuf
7 / 35
— компактный
— быстрый
— жесткая проверка типов
— стандарт у нас в компании
— прото-файл как документация
Протокол: GPB, пример
8 / 35
message A { required string x = 1; optional bool y = 2; repeated int32 z = 3; required bytes b_data = 4;}!
message B { required A a_message = 1;}
Протокол: GPB, пример 2
9 / 35
message ServerGetUser { required int64 uid = 1; optional ClientSource context = 2;}!
message ClientUser { required int64 uid = 1; required SexType gender = 2; required int32 age = 3; … }
Протокол: транспортный уровень
10 / 35
— корневое сообщение
— сквозная нумерация
— 8 байт заголовок: длина + флаги
— PROFIT
Протокол: поддержка фич
11 / 35
Протокол: поддержка фич
12 / 35
— Согласовываем!
Протокол: поддержка фич
13 / 35
— Знаем приложение / версию
— Управляем с сервера
— Управляем с клиента
Протокол: внесение изменений
14 / 35
Протокол: внесение изменений
15 / 35
— не версионируем
— предпочитаем обратно совместимые изменения
— защищаем несовместимые изменения фичами
— документируем: Sphinx (не Аксенов) + plantuml
Протокол: есть такие платформы…
16 / 35
Протокол: есть такие платформы…
17 / 35
— JS-клиенты используют тот же прото-файл
— JSON сериализация на базе прото-файла
— HTTP транспорт для JSON сообщений
— Comet для доставки push сообщений
— Минимум изменений на бекенде
Протокол: есть такие версии…
18 / 35
Протокол: есть такие версии…
19 / 35
— Upgrade message!
— Для несовременных, неугодных, неудачных версий
— Мягкий и жесткий
Протокол: куда подключаться?
20 / 35
Протокол: куда подключаться?
21 / 35
— Redirect message!
— Сервер формирует список хостов для подключения
— И портов тоже!
Протокол: итого
22 / 35
— Protobuf наше всё
— Поддержка фич: клиент и сервер договариваются на старте
— Расширение: не версионируем, добавляем с умом
— JS клиенты: Proto -> JS сериализация + HTTP + Comet
— Убиваем старое / убогое: Upgrade message!
— управление подключениями: Redirect message!
Бекенд
23 / 35
Бекенд: архитектура
24 / 35
persistent TCP
HTTP
Proxy
PHP
Photos cache
Photos
HTTP
HTTP
HTTP
iOS • Android •
WinPhone •
Бекенд: архитектура
25 / 35
EventSource
HTTP
CometPHP
Photos cache
Photos
Protobuf
HTTP
HTTP
Mobile Web • Web •
Wrappers •
Бекенд: мобильный прокси
26 / 35
— Наш сервис на C++
— Держит постоянные соединения
— Общается с PHP по HTTP
— Push в клиент
Бекенд: мобильный прокси
27 / 35
— Снижает нагрузку на php
— Fallback отдача для картинок
— Метки на соединения а-ля куки
— Статистика статистика статистика
Бекенд: сессии
28 / 35
— Сессии должны быть персистентные
— MySQL в M-M реплике
— HandlerSocket для доступа
— Memcached для части ключей
Бекенд: статистика
29 / 35
— Статистика: ~realtime + BI
— Статистика: server-side + client-side
— В перспективе: всё в BI
— Всегда разбивка по приложению + версии
Бекенд: статистика
30 / 35
— BI: Hadoop, свой ETL, Microstrategy
— Realtime: StatsCollector (наше)
— Scribe как транспорт для всего
— Pinba
— RRD
Бекенд: очереди
31 / 35
— Минимум действий online
— MySQL для очередей ибо транзакционно
— Свои фреймворки для Pub-Sub
— Darner для вспомогательных очередей
— Scribe снова как транспорт
Бекенд: итого
32 / 35
— Один протокол, разные схемы для JS и нативных клиентов
— BMA-proxy: для пушей, экономии и некоторых хитрых задач
— Сессии: MySQL/HS в комбинации с Memcached для экономии
— Статистика: scribe-транспорт + BI + RRD
— Очереди: в основном MySQL + чуть-чуть darner + тот же scribe
Деплой и тестирование
33 / 35
— Бекенд: 2 релиза в день
— Клиенты: каждый по своему
— Ручное тестирование: если можно
— Функциональные тесты: для всего
— Смоук тесты клиентов
Функциональные тесты
34 / 35
— Мини-клиент на PHP
— Все изменения, для всех версий
— Все версии протоколов / схем
— QA API для сложных случаев
Вопросы?
35 / 35
top related