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

Post on 16-Jul-2015

675 Views

Category:

Software

1 Downloads

Preview:

Click to see full reader

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