[译]BigPipe:高性能的“流水线技术”网页

原文地址:http://www.facebook.com/note.php?note_id=389414033919
译文地址:http://isd.tencent.com/?p=2419
作者:蒋长浩

Facebook的网站速度做为最关键的公司任务之一。在2009年,我们成功地实现了Facebook网站速度提升两倍。而正是我们的工程师团队的几个关键的创新使它成为可能。在本文中,我将向大家介绍我们的秘密武器之一,我们称之为BigPipe的伟大底层技术。

BigPipe是一个重新设计的基础动态网页服务体系。大体思路是,分解网页成叫做Pagelets的小块,然后通过Web服务器和浏览器建立管道并管理他们在不同阶段的运行。这是类似于大多数现代微处理器的流水线执行过程:多重指令管线通过不同的处理器执行单元,以达到性能的最佳。虽然BigPipe是对现有的服务网络基础过程的重新设计,但它却不需要改变现有的网络浏览器或服务器,它完全使用PHP和JavaScript来实现。

动机

为了更好的了解BigPipe,我们需要了解一下现有的动态Web服务系统,它的历史可以追溯到万维网的初期,但现在与初期相比却并没有多少改变。现代网站有着远远高于10年前的动态效果和互动性,但传统的网页服务系统早已无法跟上当今互联网速度的要求。在传统的模式,用户请求的生命周期如下:

1. 浏览器发送一个HTTP请求到Web服务器。
2. Web服务器解析请求,然后读取数据存储层,制定一个HTML文件,并用一个HTTP响应把它发送到客户端。
3. HTTP响应通过互联网传送到浏览器。
4. 浏览器解析Web服务器的响应,使用HTML文件构建了一个的DOM树,并且下载引用的CSS和JavaScript文件。
5. CSS资源下载后,浏览器解析它们,并将它们应用到DOM树。
6. JavaScript资源下载后,浏览器解析并执行它们。

传统模式在现代网站中效率是非常低下的,因为很多系统的操作顺序,不能互相重叠。一些如延时加载JavaScript、并行下载等优化技术已被网络社区广泛采用,以此来克服的一些限制。然而,这些优化却很少涉及Web服务器和浏览器的执行顺序造成的瓶颈。当Web服务器正忙生成一个页面,浏览器处于闲置状态,浪费其周期无所事事。当Web服务器完成生成页面,并将其发送到浏览器,浏览器则成为性能瓶颈并且Web服务器对其无从帮助。重叠Web服务器的生成时间与浏览器的渲染时间,我们不仅可以减少最终的时间延迟,也能使网页更早显示用户可见区域给用户,从而大大减少用户对延迟的感知。

Web服务器的产生时间和浏览器的渲染时间重叠,是特别有用的,如Facebook这样内容丰富的网站。一个典型的Facebook的网页包含许多来源不同的数据资料:好友名单,好友动态,广告等。在传统的网页呈现模式的用户将不得不等到这些查询数据都返回并生成最终文件,然后将其发送到用户的电脑。任何一个查询延迟都将拖慢整个最终文件的生成。

BigPipe如何工作

要利用该Web服务器和浏览器之间的并行性,BigPipe首先分解网页成多个可调用的Pagelets。正如流水线微处理器划分一个指令的生命周期为(如“取指令”,“指令解码”,“执行”,“写回寄存器”等)多个阶段,BigPipe的页面生成过程分为以下几个阶段:

1. 请求解析:Web服务器解析和完整性检查的HTTP请求。
2. 数据获取:Web服务器从存储层获取数据。
3. 标记生成:Web服务器生成的响应的HTML标记。
4. 网络传输:响应从Web服务器传送到浏览器。
5. CSS的下载:浏览器下载网页的CSS的要求。
6. DOM树结构和CSS样式:浏览器构造的DOM文档树,然后应用它的CSS规则。
7. JavaScript中下载:浏览器下载网页中JavaScript引用的资源。
8. JavaScript执行:浏览器的网页执行JavaScript代码。

前三个阶段执行,由Web服务器,最后四个阶段是由浏览器执行。每个Pagelet必须经过所有这些阶段顺序,但BigPipe在不同的阶段使几个Pagelets同时执行。

(Facebook主页的Pagelets,每个矩形对应一个Pagelet。)

上面的图片使用Facebook主页为例子来说明如何将网页是分解成Pagelets。该主页包括几个Pagelets:“作者Pagelet”,“导航Pagelet”,“新闻动态Pagelet”,“请求框Pagelet”,“广告pagelet”,“朋友推荐”和“联系”等他们是相互独立的。当“导航Pagelet”显示给用户,“新闻动态Pagelet”仍然可以在服务器上正在生成。

在BigPipe,一个用户请求的生命周期是这样的:在浏览器发送一个HTTP请求到Web服务器。在收到的HTTP请求,并在上面进行一些全面的检查,网站服务器立即发回一个未关闭的HTML文件,其中包括一个HTML 标签和标签的开始标签。标签包括BigPipe的JavaScript库来解析Pagelet以后收到的答复。在标签,有一个模板,它指定了页面的逻辑结构和Pagelets占位符。例如:

渲染后的第一个反应到客户端,Web服务器继续一个接一个生成Pagelets只要一个Pagelet生成,他将立即刷新到客户端在一个JSON编码的对象,包括所有的CSS,JavaScript的pagelet,它的HTML内容,以及一些元数据所需的资源。例如:

在客户端在收到Pagelet通过“onPageletArrive”发出的指令,BigPipe的JavaScript库将首先下载它的CSS资源;在CSS资源被下载完成后,BigPipe将在Pagelet的标记HTML显示它的innerHTML。多个Pagelets的CSS可在同一时间下载,它们可以根据其各自CSS的下载完成情况来确认显示顺序。在BigPipe中,JavaScript资源的优先级低于CSS和页面内容。因此,BigPipe不会在所有Pagelets显示出来之前下载任何Pagelet中的JavaScript。然后,所有Pagelets的JavaScript异步下载。最后Pagelet的JavaScript初始化代码根据其各自的下载完成情况来确定执行顺序。

这种高度并行系统的最终结果是,多个Pageletsr的不同执行阶段同时进行。例如,浏览器可以正在下载三个Pagelets CSS的资源,同时已经显示另一Pagelet内容,与此同时,服务器也在生成新的Pagelet。从用户的角度来看,页面是逐步呈现的。最开始的网页内容会更快的显示,这大大减少了用户的对页面延时的感知。如果您要自己亲眼看到区别,你可以尝试以下连结: 传统模式和BigPipe。第一个链接是传统模式单一模式显示页面。第二个链接是BigPipe管道模式的页面。如果您的浏览器版本比较老,网速也很慢,浏览器缓存不佳,哪么两页之间的加截时间差别将更加明显。

性能测试结果

下图是传统模式和BigPipe性能数据比较图,数据是75%用户对一个页面中最重要的内容(例如:新闻动态被认为是在Facebook主页上最重要的内容)的感知延迟时间。收集数据方式是加载Facebook主页50次并且禁用浏览器缓存。该图显示BigPipe使用户在大多数浏览器中感受到的延迟减少了一半。

(Facebook主页的延迟时间对比)

值得一提的是BigPipe是从微处理器的流水线中得到启发。然而,他们的流水线过程之间存在一些差异。例如,虽然大多数阶段BigPipe只能操作一次Pagelet,但有时多个Pagelets的CSS和JavaScript下载却可以同时运作,这类似于超标量微处理器。BigPipe另一个重要区别是,我们实现了从并行编程引入的“障碍”概念,所有的Pagelets要完成一个特定阶段,如多个Pagelet显示区,它们都可以进行进一步JavaScript下载和执行。

在Facebook,我们鼓励创造性思考。我们不断的尝试创新技术,以使我们的网站更快。

作者蒋长浩目前是Facebook的研究科学家,他致力于研究使网站更快的各种创新。

(译者还找到了几篇关于BigPipe的文章,如果有兴趣大家可以了解下:Facebook创新之BigPipe:优化页面加载时间、名站技术分析 — facebook奇特的页面加载技术、Facebook让网站速度提升一倍的BigPipe技术分析、Facebooks BigPipe Done in Java、Open BigPipe javascript implementation、Tutorial: Implementing Facebook’s BigPipe Using ASP.Net MVC、BigPipe Done in Node.js)

来源:http://isd.tencent.com/?p=2419

时间: 2024-11-01 14:22:45

[译]BigPipe:高性能的“流水线技术”网页的相关文章

[译]如何运用最新的技术提升网页速度和性能

本文讲的是[译]如何运用最新的技术提升网页速度和性能, 原文链接 : Why our website is faster than yours 原文作者 : by Declan 译文出自 : 掘金翻译计划 译者 : hpoenixf 校对者: MAYDAY1993,circlelove 我们最近升级了我们的网站.虽然这主要是界面方面的大调整,但作为一个软件开发者,我们更关注在技术细节上面.我们的目标是加强控制,关注性能,在未来可以灵活地调整和让在网站上撰写内容变得有趣.下面讲述了我们是如何让我们

红包场景下,高性能本地存储技术将硬件性能发挥到极致

直播视频回顾:https://yq.aliyun.com/edu/lesson/play/619 幻灯片下载:http://yqfile1.alicdn.com/23eb4c8ff139b424f4430f7f584915ef.pdf 以下内容根据现场分享和幻灯片整理而成. 红包业务特点 支付宝红包的大致业务架构包括单元化部署.统一接入.网关.DAO.数据库以及在线\离线数据处理,整体流程很长.其中数据库在整理的交易链路中起到承上启下的作用.在红包业务中,数据库具有三大特点: (1)峰值压力大.

CI-持续集成(2)-软件工业“流水线”技术实现(转)

1   概述 持续集成(Continuous Integration)是一种软件开发实践.在本系列文章的前一章节已经对其背景及理论体系进行了介绍.本小节则承接前面提出的理论构想进行具体的技术实现. <Google软件测试之道>: "每天,Google都要测试和发布数百万个源文件,亿万行代码.数以亿计的构建动作会触发几百万次的自动化测试,并在好几十万个浏览器实例上执行.面对这些看似不可能完成的任务,谷歌是如何测试的呢?" 希望看完此文章的人,能够自己找到自己的答案.   2 

其他杂项收藏

编程开发 其他 Universal Extractor 1.6.1 绿色多语正式版_近乎于万能的文件提取器 - 绿色软件联盟 - <绿盟:软件下载档案库> QC9.0不支持IE7,IE8.IE9的解决方法_花上的碟儿的空间_百度空间 基于HTTP协议的轻量级开源简单队列服务:HTTPSQS[原创] - 张宴的博客 - Web系统架构与底层研发 UCENTER asp.net版ucenter接口程序源码,Asp.net源码 |-51aspx.com UC(Ucenter)整合asp.net 程序

畅想智能存储,2017中国计算机大会“下一代数据中心存储技术与系统”论坛举行

10月27日,2017中国计算机大会(CNCC2017) 技术论坛"下一代数据中心存储技术与系统"在福州举行.围绕论坛主题,众多学术界顶尖学者与企业界重磅嘉宾现场对新型存储器件.多核服务器.高速网络等新硬件的发展以及下一代数据中心的存储技术和系统所面临的机遇与挑战进行了深度研讨. 众所周知,存储基础架构与系统技术是大数据与云计算数据中心的重要基石.围绕"下一代数据中心存储技术与系统",在本届论坛主席中科院计算所副研究员蒋德钧.阿里巴巴资深专家朱家稷的组织下,多位学术

电商架构技术实践的秘诀:成功就在那里,快了才是你的!

近期电商技术实战的内容非常丰富,4月15日在清华大学举办2016 ATF阿里技术论坛上的<电商技术:零到三万亿,从未停止的技术创新>,一次性分享了5位技术大神的技术干货: 淘宝移动平台事业部总经理庄卓然(南天):掌上精彩,连接过去与未来 阿里巴巴速卖通技术部总监郭东白(阿白):全球买全球卖,国际化的技术挑战 阿里巴巴资深总监司罗:阿里电商大脑,比你更懂你 阿里巴巴研究员墙辉(玄难):如何做电商业务中台 阿里巴巴研究员蒋江伟(小邪):双十一背后的分布式技术 不止这些.4月20日,云栖大会深圳峰会

浅析2011年互联网技术发展

中介交易 SEO诊断 淘宝客 云主机 技术大厅 编程语言 函数式编程语言在分布式及互联网领域依然非常受重视,但是Haskell, Erlang, Scala等语言都缺少一个契机走向主流. 在TIOBE排行中,Java依旧是第一语言,但是由于Oracle收购Sun及Oracle与Google的Android官司事件给Java发展蒙上一层阴影.在年底,IBM和Apple都先后加入了OpenJDK项目,统一化了后续Java的方向. 数据及存储 根据国外知名技术站点HackerNews上半年前的一个投票

【资料合集】红包在线技术峰会回顾集锦:讲义PDF+活动视频!

2月23日下午,2017首届在线技术峰会--"揭秘红包背后的技术"顺利召开! 来自支付宝红包技术团队.微博红包技术团队.阿里云技术团队等等9位一线实战技术专家在线分享了支付宝17年新春红包技术体系.红包场景下,实例存储技术如何将硬件性能发挥到极致.微博红包技术实践.CDN HTTPS 解决方案及优化实践.红包场景下,SLB支持业务多可用区容灾的设计和实践.付宝AR框架体系和实践.红包背后-"红"与"黑" 的较量.存储&图片技术实战优化红包

如何通过预加载器提升网页加载速度

预加载器(Pre-loader)可以说是提高浏览器性能最重要的举措.Mozilla 官方发布数据,通过预加载器技术网页的加载性能提升了19%,Chrome测试了 Alexa 排名前2000名网站,性能有20%的提升. 它并不是一门新技术,有人认为只有 Chrome 才具备这个功能.也有人认为它是有史以来提升浏览器性能最有效的方法.如果你第一次接触预加载器,也许心中已经有了无数个问号.什么是预加载器?它是如何提升浏览器性能的? 首先需要了解浏览器是如何加载网页的 一个网页的加载依赖于脚本文件.CS