Полмиллиона юзеров в онлайне без падений:...

21
Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного serverside API десктопного приложения Аверин Сергей Badoo

Upload: sergey-xek

Post on 29-Nov-2014

744 views

Category:

Technology


1 download

DESCRIPTION

Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного server-side API десктопного приложения. Сергей Аверин, Badoo. Доклад рассказывает о реально примененных способах оптимизации производительности API компании Badoo для собственных десктоп-приложений: как специфика «много постоянных соединений/однотипные запросы/большая нагрузка» повлияла на стратегию оптимизации производительности. Что было сделано: • Планирование архитектуры изначально (fault-tolerance, адаптивные апдейты и тайм-ауты, отказ от попыток восстановления после ошибок для единичных команд). • Переехали с redis на handlersocket. • Rate-limiting запросов к демонам. • Синхронизация записей. • Асинхронность. • Записи при достижении порога изменения параметров. • Профилирование кода, анализ потребления CPU, времени ответа. • Статистика, статистика и еще раз статистика. • Pconnect. Доклад будет интересен: • системным архитекторам, • server-side разработчикам.

TRANSCRIPT

Page 1: Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного server-side API десктопного

Полмиллиона  юзеров  в  онлайне  без  падений:  оптимизация  высоконагруженного  server-­‐side  API  десктопного  приложения

Аверин  СергейBadoo

Page 2: Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного server-side API десктопного

                         —  это:• Социальная  сеть  для  знакомств  с  новыми  людьми

• В  Top-­‐200  Alexa  c  2007  года

• 115  миллионов  зарегистрированных  пользователей

• 10  миллионов  пользователей  в  день

• 1,5  миллиона  фотографий  загружаются  ежедневно

Page 3: Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного server-side API десктопного

                         —  это:• 30  тыс.  запросов/с  к  PHP  backends

• MySQL,  PHP,  C/C++,  Linux,  nginx,  PHP-­‐FPM,  memcached

• Много  своего

Page 4: Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного server-side API десктопного

Badoo  Desktop• Бесплатная  Win/Mac  программа

• Поддерживает  ваш  онлайн-­‐статус  на  сайте  

• Уведомления  о  новых  событиях

• Дает  нам  местоположение  пользователя

• Удобный  доступ  к  разделам  badoo.com

Page 5: Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного server-side API десктопного

Badoo  Desktop• 1,7  миллиона  пользователей  в  месяц  

• 680  тыс.  подключенных  программ  в  пике

• 17  тыс.  запросов/с  к  PHP  backends

Page 6: Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного server-side API десктопного

Поиск  тех,  кто  неподалеку

Page 7: Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного server-side API десктопного

Сценарий  работы1. Соединяемся  с  главным  фронтендом

2. Он  отправляет  нас  на  нужный  фронтенд

3. Создаем/восстанавливаем  сессию

4. Получаем  настройки,  перевод  и  меню

5. Показываем  уведомления

6. Посылаем  данные  о  wi-­‐fi  и  скрин-­‐сейвере

Page 8: Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного server-side API десктопного

Набор  командИз  программы:

• Создание/Восстановление  сессии

• Авторизация

• Данные  о  wi-­‐fi  сетях,  работе  скрин-­‐сейвера

В  программу:

• Ваш  id  сессии,  язык  и  статус  авторизации

• Настройки,  перевод,  меню

• Уведомления

Page 9: Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного server-side API десктопного

Server-­‐side  архитектура

Page 10: Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного server-side API десктопного

Принципы  работыПрограммы:

• Протокол  асинхронный

• Не  требует  ответа  на  большинство  команд

• Как  можно  более  простые  протокол  и  логика  программ

Server-­‐side:

• При  ошибке  не  пытаемся  восстановиться,  а  прерываем  обработку  команды

• Нам  не  нужна  100%  синхронность  данных

Page 11: Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного server-side API десктопного

Специфика  приложения• Маленький  набор  и  размер  команд

• Большое  количество  постоянных  соединений

• Большой  поток  команд

• Обработка  одной  команды  занимает  мало  времени

• Время  ответа  сервера  не  так  критично,  как  для  веб-­‐страниц

• Ошибки  на  серверной  стороне  программы  сильно  не  расстраивают

Page 12: Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного server-side API десктопного

Из  беты  в  устойчивую  систему

Page 13: Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного server-side API десктопного

ОптимизацииПрофилирование  и  поиск  тормозов

• top  и  профилирование  мало  результативны

• Можно  улучшить,  изменив  логику  работы

• Real-­‐}me  профилирование  (PINBA)

• PINBA:  мониторинг  приложения,  а  не  железок

Page 14: Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного server-side API десктопного

ОптимизацииЖелезно-­‐площадочные  оптимизации

• 4  сетевые  карты

• Минимум  конкуренции

• MemCacheDB  -­‐>  Redis  -­‐>  MySQL+HandlerSocket

• Жесткие  тайм-­‐ауты

• pconnect

Page 15: Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного server-side API десктопного

ОптимизацииБорьба  с  положительной  обратной  связью

• Сам  себе  DDOS’ер

• Прогрессивные  паузы  между  командами/реконнектами

• Реконнект  на  свой  сервер

Page 16: Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного server-side API десктопного

ОптимизацииClient-­‐side  кеширование  и  логика

• Программы  отслеживают  время  обновления  статуса

• Реже  обновляют  статус  при  скрин-­‐сейвере

• Дружат  с  медленными  соединениями

Page 17: Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного server-side API десктопного

Оптимизации  Убираем  лишнюю  нагрузку

• Скешировали  все,  что  можно

• Ввели  rate-­‐limi}ng  обновления  данных

• Не  пишем,  если  не  поменялось

Page 18: Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного server-side API десктопного

ОптимизацииПороговые  срабатывания

• Порог  на  изменение  сетевой  среды

-­‐ Для  медленных  изменений  принудительно  обновляем  раз  в  10  минут

• Порог  на  вычисление  города  по  координатам

Page 19: Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного server-side API десктопного

ОптимизацииАсинхронность  и  пост-­‐обработка

• Ответ  на  команду  как  можно  раньше

• Все  сервисные  задачи  обрабатываем  отдельно

• Синхронизация  запуска  сервисных  задач

Page 20: Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного server-side API десктопного

Заключение• Мониторинг  и  профилирование

-­‐ Необходимы

-­‐ Если  вы  выпилили  все  медленые  места  в  php-­‐коде,  вы  сделали  1/7

-­‐ Меняем  логику  работы  —  улучшаем  производительность  в  10  раз

• Предусмотрите  все  возможные  проблемы  заранее  

• We  build  wheels  while  exis}ng  suck  or  don't  exist

Page 21: Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного server-side API десктопного

Спасибо!PINBA, PHP-FPM, патчи к PHP:

h�p://dev.badoo.com/

Контакты:

h�p://twi�er.com/ryba_xek

[email protected]

h�p://averin.ru/slides/