Скорость сайта Facebook считается одной из наиболее важных задач компании. В 2009 году мы успешно утроили скорость сайта Facebook. И это стало возможным благодаря нескольким ключевым инновациям нашей команды инженеров. В этой статье я познакомлю вас с одним из наших секретных соусов — великолепной базовой технологией, которую мы называем BigPipe .
BigPipe — это переработанная базовая система динамических веб-сервисов. Общая идея состоит в том, чтобы разбить веб-страницы на небольшие части, называемые Pagelets, а затем построить конвейеры через веб-серверы и браузеры для управления их выполнением на разных этапах. Это похоже на конвейерный процесс выполнения большинства современных микропроцессоров: несколько конвейеров команд проходят через разные исполнительные блоки процессора для достижения оптимальной производительности. Хотя BigPipe представляет собой модернизацию существующего процесса инфраструктуры сервисной сети, он не требует изменений в существующих веб-браузерах или серверах и полностью реализован с использованием PHP и JavaScript.
мотивация
Чтобы лучше понять BigPipe, нам нужно взглянуть на существующую систему динамических веб-сервисов. Ее историю можно проследить до первых дней существования Всемирной паутины, но сейчас она не сильно изменилась по сравнению с первыми днями. Современные веб-сайты обладают гораздо более динамичными эффектами и интерактивностью, чем 10 лет назад, но традиционные системы веб-сервисов уже давно не могут удовлетворить сегодняшние требования к скорости Интернета. В традиционной модели жизненный цикл пользовательского запроса выглядит следующим образом:
Традиционная модель очень неэффективна для современных веб-сайтов, поскольку последовательность операций многих систем не может перекрывать друг друга. Некоторые методы оптимизации, такие как отложенная загрузка JavaScript и параллельная загрузка, получили широкое распространение в онлайн-сообществе для преодоления некоторых ограничений. Однако эти оптимизации редко устраняют узкое место, вызванное порядком выполнения веб-сервера и браузера. Пока веб-сервер занят созданием страницы, браузер простаивает, тратя свои циклы на ничего не делая. Когда веб-сервер завершает создание страницы и отправляет ее браузеру, браузер становится узким местом в производительности, и веб-сервер не может помочь. Перекрывая время генерации веб-сервера и время рендеринга браузера, мы можем не только уменьшить окончательную задержку, но и позволить веб-странице отображать видимую пользователем область раньше, тем самым значительно уменьшая восприятие пользователем задержки.
Это особенно полезно для сайтов с богатым контентом, таких как Facebook, где время появления веб-сервера совпадает со временем рендеринга браузера. Типичная веб-страница Facebook содержит данные из разных источников: список друзей, обновления друзей, рекламные объявления и т. д. В традиционном режиме рендеринга веб-страницы пользователю придется ждать, пока эти данные запроса не будут возвращены, и окончательный файл будет сгенерирован, а затем отправлен на компьютер пользователя. Любая задержка запроса замедлит создание всего окончательного файла.
Как работает БигПайп
Чтобы использовать параллелизм между веб-сервером и браузером, BigPipe сначала разбивает веб-страницу на несколько вызываемых Pagelet. Подобно тому, как микропроцессор конвейера делит жизненный цикл инструкции на несколько этапов (таких как «выборка инструкции», «декодирование инструкции», «выполнение», «обратная запись в регистр» и т. д.), процесс генерации страницы BigPipe делится на следующие этапы:
Источник: ИСД