Параллельное программирование в условиях распределенных данных в Facebook

29 апрель, 2011 - 09:27Александр Москалюк

Разработчик Facebook Ник Шрок на конференции InfoQ в Лондоне описывает современные парадигмы программирования внутри Facebook, с которыми в будущем наверняка придется столкнуться и создателям других сайтов, которые поддерживают элементы социальности.

Отображение социальной информации имеет тенденцию превращаться в кучу взаимозависимых запросов к базам данных (простоты ради пока допустим, что общаемся мы с БД напрямую, без кэша). Скажем, стандартный вопрос на собеседование – какие запросы нужно сделать, чтобы заполучить ленту новостей?

  1. Получить ID друзей пользователя.
  2. Получить последние новости от каждого друга.
  3. Получить комментарии и лайки к каждой из новостей.

Полученное нужно отсортировать по какому-то механизму ранжирования, перепроверить на предмет приватности, после чего перевести в HTML.

Параллельное программирование в условиях распределенных данных в Facebook

Здесь видим несколько типов запросов: запросы, которые нужно делать в определенной последовательности (последние новости можно запрашивать только после того, как известны ID друзей) и запросы, которые можно запускать параллельно (комментарии и лайки, скажем, могут храниться в двух различных репозиториях).

Число параллельных запросов вроде не так уж и велико, однако вспомним, что ленту новостей мы показываем в контексте домашней страницы пользователя, на которой присутствует еще несколько блоков – реклама, приглашения на мероприятия, люди, которых Вы можете знать, любимые группы, последние приложения, друзья в чате, уведомления о новых сообщениях и событиях на сайте.

Весь этот балаган приходится обрабатывать в контексте PHP, который не поддерживает параллелизации запросов.

Шрок весьма подробно обьясняет специфический язык с синтаксисом PHP, использующий параллелизм, доступный внутри среды HipHop (так как PHP трансформируется в C++, который затем компилируется в бинарник).

Подход к программированию с параллелизмом в уме требует некоторого изменения ментальной модели. Вместо написания странички, где мы чего-то там достаем из базы данных, обрабатываем и прорисовываем пользовательскому броузеру, на сегодняшний день разработчик Facebook в уме разбивает процессы на несколько шагов, принимает решения касательно того, какие шаги взаимозависимы, а какие – параллелизируемы, после чего пишет код для обработки полученных данных. Абстракция Preparable многим напомнит ключевое слово yield в С# или Python, Java-программисты вспомнят о Transfer Object.

Доклад Шрока занимает 50 минут, есть интересные вопросы из зала.