36
Все о бекенде мобильных приложений Badoo Крапивный Николай

Все о бекенде мобильных приложений Badoo

Embed Size (px)

Citation preview

Page 1: Все о бекенде мобильных приложений Badoo

Все о бекенде мобильных приложений Badoo

Крапивный Николай

Page 2: Все о бекенде мобильных приложений Badoo

Badoo

1 / 35

— проект для поиска новых знакомств

— более 200М активных пользователей изо всех стран мира

— более 10М DAU

— 2½ датацентра, более 3к серверов, более 120 инженеров

— до 50к динамических RPS в пиках

Page 3: Все о бекенде мобильных приложений Badoo

Обо мне

2 / 35

— работаю в Feature team

— поддерживаем весь продуктовый функционал со стороны php

— реализуем самые извращенные мечты продуктовой команды

— и web и mobile

Page 4: Все о бекенде мобильных приложений Badoo

О чем доклад

3 / 35

— обо всём понемногу

— наши проблемы - наша боль

— технические подробности - лично

Page 5: Все о бекенде мобильных приложений Badoo

Продукт

4 / 35

X

WEB

= 12Badoo

Hotornot

Blendr

Page 6: Все о бекенде мобильных приложений Badoo

Как жить?

5 / 35

Page 7: Все о бекенде мобильных приложений Badoo

Протокол

6 / 35

Page 8: Все о бекенде мобильных приложений Badoo

Протокол: Protobuf

7 / 35

— компактный

— быстрый

— жесткая проверка типов

— стандарт у нас в компании

— прото-файл как документация

Page 9: Все о бекенде мобильных приложений Badoo

Протокол: 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;}

Page 10: Все о бекенде мобильных приложений Badoo

Протокол: 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; … }

Page 11: Все о бекенде мобильных приложений Badoo

Протокол: транспортный уровень

10 / 35

— корневое сообщение

— сквозная нумерация

— 8 байт заголовок: длина + флаги

— PROFIT

Page 12: Все о бекенде мобильных приложений Badoo

Протокол: поддержка фич

11 / 35

Page 13: Все о бекенде мобильных приложений Badoo

Протокол: поддержка фич

12 / 35

— Согласовываем!

Page 14: Все о бекенде мобильных приложений Badoo

Протокол: поддержка фич

13 / 35

— Знаем приложение / версию

— Управляем с сервера

— Управляем с клиента

Page 15: Все о бекенде мобильных приложений Badoo

Протокол: внесение изменений

14 / 35

Page 16: Все о бекенде мобильных приложений Badoo

Протокол: внесение изменений

15 / 35

— не версионируем

— предпочитаем обратно совместимые изменения

— защищаем несовместимые изменения фичами

— документируем: Sphinx (не Аксенов) + plantuml

Page 17: Все о бекенде мобильных приложений Badoo

Протокол: есть такие платформы…

16 / 35

Page 18: Все о бекенде мобильных приложений Badoo

Протокол: есть такие платформы…

17 / 35

— JS-клиенты используют тот же прото-файл

— JSON сериализация на базе прото-файла

— HTTP транспорт для JSON сообщений

— Comet для доставки push сообщений

— Минимум изменений на бекенде

Page 19: Все о бекенде мобильных приложений Badoo

Протокол: есть такие версии…

18 / 35

Page 20: Все о бекенде мобильных приложений Badoo

Протокол: есть такие версии…

19 / 35

— Upgrade message!

— Для несовременных, неугодных, неудачных версий

— Мягкий и жесткий

Page 21: Все о бекенде мобильных приложений Badoo

Протокол: куда подключаться?

20 / 35

Page 22: Все о бекенде мобильных приложений Badoo

Протокол: куда подключаться?

21 / 35

— Redirect message!

— Сервер формирует список хостов для подключения

— И портов тоже!

Page 23: Все о бекенде мобильных приложений Badoo

Протокол: итого

22 / 35

— Protobuf наше всё

— Поддержка фич: клиент и сервер договариваются на старте

— Расширение: не версионируем, добавляем с умом

— JS клиенты: Proto -> JS сериализация + HTTP + Comet

— Убиваем старое / убогое: Upgrade message!

— управление подключениями: Redirect message!

Page 24: Все о бекенде мобильных приложений Badoo

Бекенд

23 / 35

Page 25: Все о бекенде мобильных приложений Badoo

Бекенд: архитектура

24 / 35

persistent TCP

HTTP

Proxy

PHP

Photos cache

Photos

HTTP

HTTP

HTTP

iOS • Android •

WinPhone •

Page 26: Все о бекенде мобильных приложений Badoo

Бекенд: архитектура

25 / 35

EventSource

HTTP

CometPHP

Photos cache

Photos

Protobuf

HTTP

HTTP

Mobile Web • Web •

Wrappers •

Page 27: Все о бекенде мобильных приложений Badoo

Бекенд: мобильный прокси

26 / 35

— Наш сервис на C++

— Держит постоянные соединения

— Общается с PHP по HTTP

— Push в клиент

Page 28: Все о бекенде мобильных приложений Badoo

Бекенд: мобильный прокси

27 / 35

— Снижает нагрузку на php

— Fallback отдача для картинок

— Метки на соединения а-ля куки

— Статистика статистика статистика

Page 29: Все о бекенде мобильных приложений Badoo

Бекенд: сессии

28 / 35

— Сессии должны быть персистентные

— MySQL в M-M реплике

— HandlerSocket для доступа

— Memcached для части ключей

Page 30: Все о бекенде мобильных приложений Badoo

Бекенд: статистика

29 / 35

— Статистика: ~realtime + BI

— Статистика: server-side + client-side

— В перспективе: всё в BI

— Всегда разбивка по приложению + версии

Page 31: Все о бекенде мобильных приложений Badoo

Бекенд: статистика

30 / 35

— BI: Hadoop, свой ETL, Microstrategy

— Realtime: StatsCollector (наше)

— Scribe как транспорт для всего

— Pinba

— RRD

Page 32: Все о бекенде мобильных приложений Badoo

Бекенд: очереди

31 / 35

— Минимум действий online

— MySQL для очередей ибо транзакционно

— Свои фреймворки для Pub-Sub

— Darner для вспомогательных очередей

— Scribe снова как транспорт

Page 33: Все о бекенде мобильных приложений Badoo

Бекенд: итого

32 / 35

— Один протокол, разные схемы для JS и нативных клиентов

— BMA-proxy: для пушей, экономии и некоторых хитрых задач

— Сессии: MySQL/HS в комбинации с Memcached для экономии

— Статистика: scribe-транспорт + BI + RRD

— Очереди: в основном MySQL + чуть-чуть darner + тот же scribe

Page 34: Все о бекенде мобильных приложений Badoo

Деплой и тестирование

33 / 35

— Бекенд: 2 релиза в день

— Клиенты: каждый по своему

— Ручное тестирование: если можно

— Функциональные тесты: для всего

— Смоук тесты клиентов

Page 35: Все о бекенде мобильных приложений Badoo

Функциональные тесты

34 / 35

— Мини-клиент на PHP

— Все изменения, для всех версий

— Все версии протоколов / схем

— QA API для сложных случаев

Page 36: Все о бекенде мобильных приложений Badoo

Вопросы?

35 / 35