Инфраструктура социального проекта

4,043 views

Published on

Published in: Technology, Business
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,043
On SlideShare
0
From Embeds
0
Number of Embeds
2,016
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Инфраструктура социального проекта

  1. 1. Инфраструктура социального проекта Александр Москалюк, Facebook, Inc. [email_address]
  2. 2. Немного о Facebook <ul><li>67 миллионов активных пользователей </li></ul><ul><ul><li>Считаем только активные логины за последние 30 дней </li></ul></ul><ul><li>На сайте около 55,000 сетей </li></ul><ul><ul><li>Вузы, компании, регионы </li></ul></ul><ul><li>45% пользователей возвращаются на сайт ежедневно </li></ul><ul><ul><li>Средняя сессия длится 25 мин. </li></ul></ul>
  3. 3. Немного о Facebook <ul><li>65 млрд. показов страниц в месяц </li></ul><ul><ul><li>5 - ый самый посещаемый сайт в мире (ComScore) </li></ul></ul><ul><ul><li>2-ой по посещаемости социальный сайт </li></ul></ul><ul><ul><li>1-ый по посещаемости фото-сайт </li></ul></ul><ul><ul><li>14 миллионов новых фото ежедневно </li></ul></ul><ul><ul><li>По трафику это фото-сайт #1, превышает сумму трафика #2, #3, #4 </li></ul></ul><ul><ul><li>20,000 приложений </li></ul></ul><ul><ul><li>95% пользователей попробовали минимум одно приложение </li></ul></ul>
  4. 5. Архитектура проекта <ul><li>Fedora Core </li></ul><ul><li>Apache </li></ul><ul><li>MySQL </li></ul><ul><li>PHP для Web- сайта </li></ul><ul><li>C++ для различных оффлайновых систем </li></ul>
  5. 6. Что используется в Facebook <ul><li>Python для обработки данных </li></ul><ul><li>Erlang для чат-серверов </li></ul><ul><li>Hadoop для параллельного процессинга </li></ul><ul><li>Memcached для кэширования </li></ul>
  6. 7. Что мы пишем сами <ul><li>Memcached – основные разработчики </li></ul><ul><li>PHP – в основном работа над некоторыми ошибками </li></ul><ul><li>Apache – список патчей для Apache и PHP лежит здесь http://mirror.facebook.com/facebook/patches/ </li></ul><ul><li>Thrift – «экономная» архитектура «сервер-клиент» для ряда языков программирования </li></ul>
  7. 8. Пишем сами <ul><li>PHPEmbed – библиотека для C++, позволяющая получить доступ к интерпретатору PHP и функциям сайта </li></ul><ul><li>Phpsh – оболочка для получения доступа к функциям сайта с командной строки </li></ul><ul><li>Facebook Animation - библиотека для JavaScript </li></ul><ul><li>Flvtool++ - инструмент для работы с видео FLV </li></ul><ul><li>Hive – примитивная SQL- модель для Hadoop </li></ul>
  8. 9. Memcached в Facebook <ul><li>В мае 2007 г. 200 серверов, 4 процессорных ядра на каждом </li></ul><ul><li>В апреле 2008 г. 1,008 серверов, 4 ядра на сервер </li></ul><ul><li>Memcached хранит информацию, которая полезна для сайта – переменные и массивы в PHP </li></ul><ul><ul><li>Основная задача – уменьшить к-во запросов к MySQL </li></ul></ul>
  9. 10. Memcached в Facebook <ul><li>Переписана функция доступа к Memcached </li></ul><ul><ul><li>Для получения данных вызываем единую функцию </li></ul></ul><ul><ul><li>Функция смотрит в Memcached, если данные есть там, то возвращает их </li></ul></ul><ul><ul><li>Иначе делаем запрос к БД, заодно кэшируем данные на будущее </li></ul></ul><ul><ul><li>Итого каждый запрос к Memcached кроме ключа содержит функцию, которая делает запрос к БД </li></ul></ul><ul><li>Между дата-центрами делаем репликацию Memcached, сродни репликации MySQL </li></ul>
  10. 11. LAMP + сервисы <ul><li>Сайт написан на PHP </li></ul><ul><li>Вспомогательные сервисы написаны не на PHP (C++, Java, др.) </li></ul><ul><li>Сервисы часто используют Memcached для общения с сайтом – «подогревают» кэши для пользователей, которые заходят на сайт </li></ul><ul><li>Иногда данные, сгенерированные C++ -сервером, нужно прочитать в Java- программе </li></ul>
  11. 12. LAMP + сервисы
  12. 13. Facebook Thrift <ul><li>Facebook Thrift - http://developers.facebook.com/thrift/ </li></ul><ul><li>Кто еще умеет отсылать удаленные запросы? </li></ul><ul><ul><li>SOAP – куча XML </li></ul></ul><ul><ul><li>CORBA – перегружена </li></ul></ul><ul><ul><li>COM – в основном для Windows </li></ul></ul><ul><ul><li>Буферы для протоколов – закрытая технология от Google </li></ul></ul>
  13. 14. Принципы работы Thrift <ul><li>Создаем один файл - .thrift </li></ul><ul><li>Получаем клиентские и серверные методы для PHP, C++, Java и Python </li></ul>
  14. 15. Facebook Thrift <ul><li>#!/usr/local/bin/thrift --php –cpp –-java –py </li></ul><ul><li>enum GENDER { </li></ul><ul><li>MALE = 1, </li></ul><ul><li>FEMALE = 2, </li></ul><ul><li>ROBOT = 3 </li></ul><ul><li>} </li></ul><ul><li>struct Profile { </li></ul><ul><li>1: i64 id, </li></ul><ul><li>2: string name, </li></ul><ul><li>3: GENDER g </li></ul><ul><li>} </li></ul>
  15. 16. Определение сервиса <ul><li>service ProfileCache { </li></ul><ul><li>void setProfile(1: Profile p), </li></ul><ul><li>Profile getProfile(1: i32 id) </li></ul><ul><li>} </li></ul>
  16. 17. Что это нам дало? - Файлы <ul><li>gen-cpp/ </li></ul><ul><li>Facebook_types.cpp </li></ul><ul><li>Facebook_types.h </li></ul><ul><li>ProfileCache.cpp </li></ul><ul><li>ProfileCache.h </li></ul><ul><li>ProfileCache_server.skeleton.cpp </li></ul><ul><li>gen-php/ </li></ul><ul><li>Facebook_types.php </li></ul><ul><li>ProfileCache.php </li></ul>
  17. 18. Еще файлы <ul><li>gen-py/Facebook/ </li></ul><ul><li>ttypes.py </li></ul><ul><li>ProfileCache.php </li></ul><ul><li>ProfileCache-remote </li></ul><ul><li>gen-java/ </li></ul><ul><li>GENDER.java </li></ul><ul><li>ProfileCache.java </li></ul><ul><li>Profile.java </li></ul>
  18. 19. Что это нам дало? – C ++ <ul><li>namespace facebook { namespace profile { </li></ul><ul><li>enum GENDER { ... }; </li></ul><ul><li>class Profile { </li></ul><ul><li>public: </li></ul><ul><li>Profile() : id(0), name(&quot;&quot;), g((GENDER)0) {} </li></ul><ul><li>virtual ~Profile() throw() {} </li></ul><ul><li>int64_t id; </li></ul><ul><li>std::string name; </li></ul><ul><li>GENDER g; </li></ul><ul><li>... </li></ul><ul><li>}; </li></ul><ul><li>}} // namespace </li></ul>
  19. 20. Что это нам дало? – C++ <ul><li>namespace facebook { namespace profile { </li></ul><ul><li>class ProfileCacheClient { </li></ul><ul><li>public: </li></ul><ul><li>void setProfile(const Profile& p); </li></ul><ul><li>void getProfile(Profile& _return, const int32_t id); </li></ul><ul><li>} </li></ul>
  20. 21. Что это нам дало? - PHP <ul><li><?php </li></ul><ul><li>include_once $GLOBALS['THRIFT_ROOT'].'/Thrift.php'; </li></ul><ul><li>final class GENDER { ... } </li></ul><ul><li>class Profile { </li></ul><ul><li>public $id = null; </li></ul><ul><li>public $name = null; </li></ul><ul><li>public $g = null; </li></ul><ul><li>} </li></ul><ul><li>Class ProfileCache { </li></ul><ul><li>public function setProfile (&$p); </li></ul><ul><li>public function getProfile ($id); </li></ul><ul><li>} </li></ul>
  21. 22. Описываем TTransport <ul><li>public abstract class TTransport { </li></ul><ul><li>public abstract boolean isOpen(); </li></ul><ul><li>public abstract void open() </li></ul><ul><li>throws TTransportException; </li></ul><ul><li>public abstract void close(); </li></ul><ul><li>public abstract int read(byte[] buf, int off, int len) </li></ul><ul><li>throws TTransportException; </li></ul><ul><li>public int readAll(byte[] buf, int off, int len) </li></ul><ul><li>throws TTransportException {} </li></ul><ul><li>public abstract void write(byte[] buf, int off, int len) </li></ul><ul><li>throws TTransportException; </li></ul><ul><li>} </li></ul>
  22. 23. Thrift – принципы работы <ul><li>Данные описывают себя </li></ul><ul><ul><li>Используем типы данных, которые присутствуют во всех поддерживаемых языках </li></ul></ul><ul><li>TProtocol и TTransport – классы для поддержки стандартного стека </li></ul><ul><li>Самая стандартная конфигурация для нас – TSocket и TBinaryProtocol </li></ul>
  23. 24. Принципы работы <ul><li>Пользователи могут создавать свои классы для поддержки новых протоколов и транспортных каналов </li></ul><ul><li>Все аргументы в методах пронумерованы, клиент и сервер можно обновлять самостоятельно </li></ul><ul><li>Thrift за 5 минут: http://developers.facebook.com/thrift/tutorial.thrift </li></ul>
  24. 25. Логи с асинхронным воспроизведением <ul><li>Web- клиенты пишут в лог о каждом событии на сайте </li></ul><ul><li>Сервис News Feed по мере возможностей обходит эти логи, воспроизводит события </li></ul><ul><li>Если события интересны, новости о них уходят в БД пользователей </li></ul>
  25. 27. NewsFeed <ul><li>В феврале 2007 г.: </li></ul><ul><ul><li>17 миллионов пользователей </li></ul></ul><ul><ul><li>2 миллиарда дружеских связей </li></ul></ul><ul><ul><li>5 млрд. новых событий в логе ежечасно </li></ul></ul><ul><ul><li>Обрабатывали 12 млн. новостей в секунду </li></ul></ul><ul><ul><li>Публиковали 0.1% всех новостей </li></ul></ul><ul><ul><li>109 машин </li></ul></ul><ul><li>В феврале у нас еще не было: </li></ul><ul><ul><li>67 млн. пользователей </li></ul></ul><ul><ul><li>Платформы для приложений </li></ul></ul><ul><ul><li>Beacon </li></ul></ul>
  26. 28. Логи для продуктов <ul><li>Любой продукт может писать в специальный лог </li></ul><ul><li>Локальный Thrift- клиент отправляет данные центральному лог-серверу </li></ul><ul><ul><li>В этот клиент можно встроить логику выбора разных серверов в зависимости от характера и источника сообщения </li></ul></ul>
  27. 29. Логи для продуктов <ul><li>Разработчики продуктов могут самостоятельно отслеживать здоровье продуктов на сайте </li></ul><ul><li>Имеем представление о «состоянии здоровья» системы в целом </li></ul><ul><li>Технология готовится стать открытой, используется некоторыми стартапами </li></ul>
  28. 30. Пример использования: поиск <ul><li>109 млн запросов в месяц только в США (делает Facebook 10-ым поисковиком - ComScore ) </li></ul><ul><li>Год назад 600 млн поисковых запросов </li></ul><ul><li>1 ТБ индекса в памяти </li></ul><ul><li>Требование к запросу - < 100 мс </li></ul><ul><li>При выдаче результатов учитывать социальный граф пользователя </li></ul>
  29. 32. PHPEmbed <ul><li>Многие из функций PHP приходится использовать за пределами PHP </li></ul><ul><li>Сперва это кажется легким – есть С++-клиенты для Memcached, MySQL </li></ul><ul><li>В горизонтально распаралелленой архитектуре возникают специфические библиотеки для доступа к данным </li></ul><ul><li>До какого-то времени это можно параллельно развивать в С++ </li></ul>
  30. 34. PHPEmbed <ul><li>Библиотека для работы с PHP -интерпретатором </li></ul><ul><li>Делает все то, что доступно через SAPI </li></ul><ul><li>Вызов PHP- функции из С++: </li></ul><ul><ul><li>long memused = p.call_long(&quot;memory_get_usage&quot;); </li></ul></ul><ul><ul><li>hash_set<string> ex; </li></ul></ul><ul><ul><li>ex = p.call_string_hash_set(&quot;get_loaded_extensions&quot;); </li></ul></ul>
  31. 35. Hadoop <ul><li>Открытый аналог Google MapReduce от Apache Foundation - http://hadoop.apache.org </li></ul><ul><li>Поддерживается в основном Yahoo! </li></ul><ul><li>Используется даже внутри Google </li></ul><ul><li>Крупнейший кластер – Yahoo! – 2 , 000 узлов, 4 ядра на узле </li></ul>
  32. 36. Hadoop в Facebook <ul><li>Второй по размеру кластер – Facebook, 320 8-ядерных узлов, 2,560 процессоров </li></ul><ul><li>Активно используется для аналитики и обработки серверных логов </li></ul><ul><li>Особой популярностью пользуется Hadoop Streaming из-за простоты подключения скриптов в PHP и Python </li></ul>
  33. 37. Hadoop Hive <ul><li>Продукт для запросов типа SQL для программ типа Map/Reduce внутри Hadoop </li></ul><ul><ul><li>Имея на руках коллекцию огромных текстовых файлов, описываем их структуру, присваивая названия колонок в ДБ полям внутри текстовых файлов </li></ul></ul><ul><ul><li>Задаем запрос типа SELECT ad_click_id, ad_click_time, user_id, click_price </li></ul></ul>
  34. 38. Особенности Hive <ul><ul><li>Не поддерживается WHERE – вместо этого пишем собственную map- программу, которая проходит по каждой строке и возвращает только валидные строки </li></ul></ul><ul><ul><li>В reduce- программе ведем учет тех данных, которые необходимы для аналитики. По окончанию исполнения можем сохранить данные в любом формате. </li></ul></ul><ul><ul><li>Поскольку логи собираются ежедневно, то «таблицы» в Hive – это конкретные логи за день </li></ul></ul>
  35. 39. Примеры запросов к Hive <ul><li>Общее количество показов рекламных блоков в системе </li></ul><ul><li>Количество кликов в системе за конкретный день </li></ul><ul><li>Какой процент пользователей с приложением Facebook для iPhone загружают фотографии с устройства? </li></ul><ul><li>Какие администраторы создают наиболее популярные группы на сайте? </li></ul>
  36. 40. Вопросы, решаемые Hive <ul><li>Кто оставляет больше записей в форумах в конкретные дни – мужчины или женщины ? </li></ul><ul><li>Какой разброс среднего количества друзей для пользователей, присоединившихся к Facebook в течение последних двух недель? </li></ul><ul><li>Если пользователь загрузил фотографии, какова вероятность того, что в этот же день он оставит запись в блоге? </li></ul><ul><li>Существует ли высокая взаимозависимость между шагом А и шагом Б? </li></ul><ul><ul><li>Если 80% пользователей, добавляющих музыкальное приложение, ищет по именам тех музыкантов, которые прописаны в профиле, то, может, изменить интерфейс для ускорения этого процесса? </li></ul></ul>
  37. 41. Собственно архитектура <ul><li>Горизонтальное распределение баз данных </li></ul><ul><li>Репликация MySQL для копирования данных </li></ul><ul><li>Каждый пользователь привязан к конкретной базе данных </li></ul><ul><li>Существует пул центральных БД для данных, которые распределять не нужно </li></ul>
  38. 42. Web- серверы <ul><li>PHP- код знает нужную базу данных </li></ul><ul><ul><li>Чтобы это знали другие, используем PHPEmbed </li></ul></ul><ul><li>Переменные и массивы PHP храним в Memcached </li></ul><ul><ul><li>Некоторые вещи, постоянно хранимые в кэше – личная информация пользователя, список друзей, список приложений </li></ul></ul><ul><li>Разработчик сам выбирает схему использования кэша </li></ul>
  39. 43. Приложения <ul><li>Существует пул серверов для обслуживания запросов приложений </li></ul><ul><li>Этот пул говорит непосредственно с Web- серверами </li></ul><ul><ul><li>Приложениям возвращаются те же данные, что и пользователю Facebook </li></ul></ul><ul><li>Web- и API- пулы общаются через Thrift </li></ul><ul><li>FQL- запросы через Thrift передаются БД </li></ul>
  40. 44. Упрощаем сайт <ul><li>FBML- парсер был сделан на PHP, потом переписан на С++ </li></ul><ul><li>Сегодня практически вся функциональность Facebook – это приложения </li></ul><ul><ul><li>Приложения Photos, Events, Groups от Facebook можно удалить </li></ul></ul><ul><li>Вполне реально удалить всю функциональность Facebook, но оставаться на Facebook </li></ul><ul><li>Будущая функциональность рассматривается как новое приложение, и как возможность поддерживать приложения других </li></ul>
  41. 45. Интернационализация сайта <ul><li>Задача: перевести сайт на 1 язык </li></ul><ul><ul><li>Решение: нанимаем человека, он приходит и с 8 до 5 переводит сайт </li></ul></ul><ul><ul><li>Изредка человеку обьясняют специфические термины ( poke, tag , mini-feed) </li></ul></ul><ul><ul><li>С выходом новой функции просим человека перевести еще немного предложений </li></ul></ul>
  42. 46. i18n <ul><li>Задача: перевести сайт на 200 языков </li></ul><ul><ul><li>«Решение»: нанимаем 200 переводчиков, либо 5-6 полиглотов </li></ul></ul><ul><li>Удачное решение для создания контента на разных языках: Wikipedia </li></ul><ul><li>Удачное решение для фильтрации и модерации: Digg, Reddit </li></ul>
  43. 47. Другие варианты
  44. 48. Приложение Translations <ul><li>Заинтересованные пользователи устанавливают приложение </li></ul><ul><ul><li>Незаинтересованные могут продолжать пользоваться сайтом </li></ul></ul><ul><li>Вначале переводятся базовые термины </li></ul><ul><ul><li>Надо определиться, как в другом языке будут называться groups, networks, events, applications </li></ul></ul>
  45. 49. i18n - продолжение <ul><li>Пользователи сами голосуют за предложенные варианты </li></ul><ul><ul><li>Для базовых фраз используем глоссарий </li></ul></ul><ul><ul><li>Способствует более художественному переводу ( mini-feed = одной строкой) </li></ul></ul><ul><ul><li>Легко отсеять вандализм </li></ul></ul>
  46. 50. Приложение Translations <ul><li>Испанский – пользователи перевели сайт на 100% за неделю </li></ul><ul><li>Профессиональные переводчики только закончили уточнять спорную терминологию </li></ul><ul><li>К запуску испанского сайта в такие сроки не были готовы даже мы </li></ul><ul><li>Никто не жалуется на кривой перевод </li></ul>
  47. 51. Facebook Video <ul><li>Аналогично с запуском платформы мы запустили Facebook Video </li></ul><ul><li>Приложения для обмена видео в социальном контексте (не для публичного просмотра) </li></ul><ul><li>Разработчики захотели добавить видео-сообщения </li></ul><ul><li>В итоге добавили поддержку сообщений для любой платформы </li></ul>
  48. 53. Вопросы? Пожелания? <ul><li>[email_address] </li></ul>

×