Разработчик Facebook Ник Шрок на конференции InfoQ в Лондоне описывает современные парадигмы программирования внутри Facebook, с которыми в будущем наверняка придется столкнуться и создателям других сайтов, которые поддерживают элементы социальности.
Отображение социальной информации имеет тенденцию превращаться в кучу взаимозависимых запросов к базам данных (простоты ради пока допустим, что общаемся мы с БД напрямую, без кэша). Скажем, стандартный вопрос на собеседование – какие запросы нужно сделать, чтобы заполучить ленту новостей?
Полученное нужно отсортировать по какому-то механизму ранжирования, перепроверить на предмет приватности, после чего перевести в HTML.
Здесь видим несколько типов запросов: запросы, которые нужно делать в определенной последовательности (последние новости можно запрашивать только после того, как известны ID друзей) и запросы, которые можно запускать параллельно (комментарии и лайки, скажем, могут храниться в двух различных репозиториях).
Число параллельных запросов вроде не так уж и велико, однако вспомним, что ленту новостей мы показываем в контексте домашней страницы пользователя, на которой присутствует еще несколько блоков – реклама, приглашения на мероприятия, люди, которых Вы можете знать, любимые группы, последние приложения, друзья в чате, уведомления о новых сообщениях и событиях на сайте.
Весь этот балаган приходится обрабатывать в контексте PHP, который не поддерживает параллелизации запросов.
Шрок весьма подробно обьясняет специфический язык с синтаксисом PHP, использующий параллелизм, доступный внутри среды HipHop (так как PHP трансформируется в C++, который затем компилируется в бинарник).
Подход к программированию с параллелизмом в уме требует некоторого изменения ментальной модели. Вместо написания странички, где мы чего-то там достаем из базы данных, обрабатываем и прорисовываем пользовательскому броузеру, на сегодняшний день разработчик Facebook в уме разбивает процессы на несколько шагов, принимает решения касательно того, какие шаги взаимозависимы, а какие – параллелизируемы, после чего пишет код для обработки полученных данных. Абстракция Preparable многим напомнит ключевое слово yield в С# или Python, Java-программисты вспомнят о Transfer Object.
Доклад Шрока занимает 50 минут, есть интересные вопросы из зала.