关于web应用,从html的产生,到客户端浏览器的渲染,有3个重要的组成部分:
1.html在服务端生成
2.网络传输
3.浏览器渲染
在html生成的过程中,可能会用到cache,可能会链接数据库等等,对于负责的html页面,都要经过很多业务流程
facebook的做法是使html的生成变成多个步骤,每生成一小部分html(facebook给这种编程模型起了个名字叫做PageLet),就发送到网络上,浏览器就先展示最先发送的一部分,使整个页面传输的过程流水化,提高页面呈现速度。
经过流水化的页面生成后,整个过程变为:
可以很直观的看到,经过流水化处理后,整体速度快了1倍。
下边是一个java实现的简易BigPipeDemo
package com.opencfg.web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Facebook BigPipe Demo
*
* @author haitao.tu
* @date 2010-01-03
*/
public class BigPipeServlet extends HttpServlet {
private static final long serialVersionUID = 1344983665902790319L;
@Override
protected void service(HttpServletRequest req,
final HttpServletResponse resp) throws ServletException,
IOException {
PrintWriter writer = resp.getWriter();
String doctype = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">";
String head = "<html>"
+ "<head>"
+ "<meta http-equiv='Content-type' content='text/html; charset=utf-8' />"
+ "<meta http-equiv=\"Content-language\" content=\"zh\" />";
writer.write(doctype);
writer.write(head);
writer.write(build_script_function());
writer.write("</head><body><div>loading...");
build_frame(writer, "id1", "id2", "id3", "id4", "id5", "id6");
writer.write("</div>");
pagelet(writer, "id1", "PageLet1");
sleep(4000);
pagelet(writer, "id2", "PageLet2");
sleep(4000);
pagelet(writer, "id3", "PageLet3");
sleep(4000);
pagelet(writer, "id4", "PageLet4");
sleep(4000);
pagelet(writer, "id5", "PageLet5");
sleep(4000);
pagelet(writer, "id6", "PageLet6");
writer.write("</body></html>");
writer.close();
}
/**
* 构造页面原型
*/
private void build_frame(PrintWriter writer, String... ids) {
for (String id : ids) {
writer.write("<div id='" + id + "'>-</div>");
}
}
/**
* 构造javascript方法
*/
private String build_script_function() {
return "<script type='text/javascript'>function show(id,text){document.getElementById(id).innerHTML = text;}</script>";
}
/**
* 构造javascript调用
*/
private String build_script_call(String id, String content) {
return "<script>show('" + id+ "','" + content + "')</script>";
}
/**
* 发送facebook pagelet html包
*/
private void pagelet(PrintWriter writer, String id, String content) {
if(writer.checkError())
return;
writer.write(build_script_call(id, content));
writer.flush();
}
private void sleep(int times) {
try {
Thread.sleep(times);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
下边用wireshark抓包,看下是否产生想要的流水效果:
图中可以看出"TCP segment",至于收到一个报文后如何确定它是一个"TCP segment"?
如果有几个报文的ACK序号都一样,并且这些报文的Sequence
Number都不一样,并且后一个Sequence Number为前一个Sequence Number加上前一个报文大小再加上1的话,肯定是TCP
segment了。
在硬件上有很多网络设备可以在收到TCP大报文后切分成小报文发送出去,但是BigPipe的意义在于流水化,从而使用户尽可能快的得到页面响应。
以上是个人浅显的理解,希望以后能继续深入:)
分享到:
相关推荐
Facebook的BigPipe是一种高效网页加载技术,旨在提升用户体验,通过分块加载页面内容来显著减少网页的加载时间。它最初由Facebook开发,并已开源。在这个Java版本的实现中,我们有机会深入理解BigPipe如何在非PHP...
BigPipe技术不仅适用于Facebook这样的大型社交网站,也可以应用于电子商务、新闻门户等需要快速响应的Web应用。通过对页面加载流程的优化,可以显著提升用户的浏览体验,降低页面加载的跳出率。 综上所述,BigPipe...
BigPipe技术是一种优化网页加载速度的方法,最初由Facebook提出,其核心思想是将一个完整的网页分割成多个小的、独立的模块,称为Pagelet,然后逐个加载这些模块,就像流水线作业一样,从而显著减少用户等待整个页面...
Java 实现 BigPipe 技术详解(上) 在 Web 应用开发中,为了提高页面加载速度和用户体验,BigPipe 技术应运而生。它最初由 Facebook 提出,目的是将一个大页面拆分成多个小的部分(称为“管道”或“页面片段”),...
Facebook介绍了一个名为BigPipe的技术,这项技术可使Facebook站点的访问速度提升一倍。目前,也有一小部分文章介绍了该技术在JSP中的实现,但是这些文章只是基于Servlet的理论实现,对于JavaWeb开发者来说并不存在...
.NET BIGPIPE是一个优化Web...总的来说,.NET BigPipe技术是提高ASP.NET网站性能的有效手段,尤其是在高流量和复杂页面的场景下。通过理解和正确使用这个技术,开发者能够提升用户满意度,同时优化服务器资源的利用。
`BigPipe`是一种技术,最初由Facebook提出,用于提高网页加载效率,通过分割页面为多个部分并异步加载,达到类似流式传输的效果。它使得用户可以更快地看到页面的部分内容,而无需等待整个页面完全加载。在Java Web...
ASP.NET MVC 2.0 BigPipe 假想是一种优化Web应用性能的技术,灵感来源于Facebook的BigPipe。BigPipe的主要思想是将页面加载分为多个独立的部分,这些部分可以并行加载,从而显著提高页面渲染速度,提升用户体验。在...
### 一、bigPipe技术基础 1. **分块加载**:bigPipe的核心是将一个网页分解为多个逻辑单元,每个单元作为一个独立的“管道”进行加载。这样,用户可以更快地看到页面的初步内容,而不是等待整个页面完全加载。 2. ...
BigPipe是一种由Facebook提出的高效页面加载策略,它通过将一个页面拆分成多个部分(或称为“管道”),并逐个异步加载这些部分,来显著加快网页的初始展现速度。在本文中,我们将探讨BigPipe的设计原理以及如何使用...
通过这样的实现,我们可以看到C#不仅可以用于传统的后端服务开发,也可以用于优化前端用户体验,尤其是在大数据量的网页加载场景下,C#实现的BigPipe技术能显著提升页面的加载速度,从而改善用户对网站的满意度。
Webx之BigPipe技术是一种优化Web页面加载性能的方法,它借鉴了Facebook的BigPipe理念,旨在提高用户体验,尤其是在处理大量动态内容的Web应用中。Webx是一个基于Java的开源Web框架,而BigPipe则是Webx框架中的一个...
JavaScript在BigPipe技术中扮演着至关重要的角色。它负责以下几方面的工作: 1. **异步请求**:使用XMLHttpRequest或Fetch API发送多个异步请求,获取每个页面片段的数据。 2. **数据处理**:接收到服务器返回的...
Pipelining,即BigPipe,是Facebook提出的一种创新的页面渲染技术。传统网页加载时,所有组件(如HTML、CSS、JavaScript等)通常是串行下载的,而BigPipe则将页面拆分为多个部分(称为“管道”),并并行地分发这些...
4. **BigPipe**:为了解决页面加载速度问题,Facebook推出了BigPipe技术,它将网页分割成多个小部分并异步加载,显著提高了用户体验。 5. **数据库优化**:Facebook早期使用MySQL,但随着数据量的增长,他们引入了...
【BigPipe技术详解与Node.js实现】 BigPipe是由Facebook开发的一种网页加载优化技术,旨在显著提升用户在浏览网页时的加载速度。它通过将页面分割为多个独立的部分(称为Pagelets),并利用HTTP的流式传输特性,...
BigPipe 技术,最初由 Facebook 提出,是一种有效的页面异步加载策略,它能显著降低页面加载时间,尤其是在处理复杂、数据丰富的动态页面时。本文将探讨如何使用 Node.js 结合 BigPipe 来实现这一技术,并讨论其优...
随着时间的发展,Facebook引入了“BigPipe”技术,它将网页加载分成了多个小部分,实现了按需加载,显著提高了页面加载速度。此外,Facebook还广泛使用了分布式缓存系统Memcached和NoSQL数据库HBase,以及图数据库...