`
tuhaitao
  • 浏览: 379283 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Facebook BigPipe技术

    博客分类:
  • java
阅读更多

 

关于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的意义在于流水化,从而使用户尽可能快的得到页面响应。

 

以上是个人浅显的理解,希望以后能继续深入:)

 

 

1
3
分享到:
评论
3 楼 tuhaitao 2011-12-07  
zhans52 写道
请问这个是多个请求 还是一个请求多个传送?

也就是它是每一小部分都有发送一个请求,还是一共只有一次请求、每一小部分html分别传送呢

一次请求,多次传送
2 楼 zhans52 2011-12-03  
请问这个是多个请求 还是一个请求多个传送?

也就是它是每一小部分都有发送一个请求,还是一共只有一次请求、每一小部分html分别传送呢
1 楼 llyzq 2011-01-04  
嗯,这个很有意思

第一次看到有这样的技术

希望博主能多写一点相关的内容

相关推荐

    facebook bigpipe Java版本实现

    Facebook的BigPipe是一种高效网页加载技术,旨在提升用户体验,通过分块加载页面内容来显著减少网页的加载时间。它最初由Facebook开发,并已开源。在这个Java版本的实现中,我们有机会深入理解BigPipe如何在非PHP...

    BigPipe技术java源代码

    BigPipe技术不仅适用于Facebook这样的大型社交网站,也可以应用于电子商务、新闻门户等需要快速响应的Web应用。通过对页面加载流程的优化,可以显著提升用户的浏览体验,降低页面加载的跳出率。 综上所述,BigPipe...

    BigPipe技术后端实现分享 新浪微博新版中的Bigpipe Server端的php实现 共39页.ppt

    BigPipe技术是一种优化网页加载速度的方法,最初由Facebook提出,其核心思想是将一个完整的网页分割成多个小的、独立的模块,称为Pagelet,然后逐个加载这些模块,就像流水线作业一样,从而显著减少用户等待整个页面...

    java实现bigpipe(上)

    Java 实现 BigPipe 技术详解(上) 在 Web 应用开发中,为了提高页面加载速度和用户体验,BigPipe 技术应运而生。它最初由 Facebook 提出,目的是将一个大页面拆分成多个小的部分(称为“管道”或“页面片段”),...

    基于Struts2标签的BigPipe技术实现

    Facebook介绍了一个名为BigPipe的技术,这项技术可使Facebook站点的访问速度提升一倍。目前,也有一小部分文章介绍了该技术在JSP中的实现,但是这些文章只是基于Servlet的理论实现,对于JavaWeb开发者来说并不存在...

    NET BIGPIPE vs2010

    .NET BIGPIPE是一个优化Web...总的来说,.NET BigPipe技术是提高ASP.NET网站性能的有效手段,尤其是在高流量和复杂页面的场景下。通过理解和正确使用这个技术,开发者能够提升用户满意度,同时优化服务器资源的利用。

    bigpipe 基于struts2标签实现

    `BigPipe`是一种技术,最初由Facebook提出,用于提高网页加载效率,通过分割页面为多个部分并异步加载,达到类似流式传输的效果。它使得用户可以更快地看到页面的部分内容,而无需等待整个页面完全加载。在Java Web...

    Asp.net MVC2.0 BigPipe假想

    ASP.NET MVC 2.0 BigPipe 假想是一种优化Web应用性能的技术,灵感来源于Facebook的BigPipe。BigPipe的主要思想是将页面加载分为多个独立的部分,这些部分可以并行加载,从而显著提高页面渲染速度,提升用户体验。在...

    net bigPipe

    ### 一、bigPipe技术基础 1. **分块加载**:bigPipe的核心是将一个网页分解为多个逻辑单元,每个单元作为一个独立的“管道”进行加载。这样,用户可以更快地看到页面的初步内容,而不是等待整个页面完全加载。 2. ...

    高性能页面加载技术--BigPipe设计原理及Java简单实现

    BigPipe是一种由Facebook提出的高效页面加载策略,它通过将一个页面拆分成多个部分(或称为“管道”),并逐个异步加载这些部分,来显著加快网页的初始展现速度。在本文中,我们将探讨BigPipe的设计原理以及如何使用...

    C#实现仿新浪微博BigPipe

    通过这样的实现,我们可以看到C#不仅可以用于传统的后端服务开发,也可以用于优化前端用户体验,尤其是在大数据量的网页加载场景下,C#实现的BigPipe技术能显著提升页面的加载速度,从而改善用户对网站的满意度。

    webx之bigpipe

    Webx之BigPipe技术是一种优化Web页面加载性能的方法,它借鉴了Facebook的BigPipe理念,旨在提高用户体验,尤其是在处理大量动态内容的Web应用中。Webx是一个基于Java的开源Web框架,而BigPipe则是Webx框架中的一个...

    bigpipe-demo1:简单的 bigpipe 演示

    JavaScript在BigPipe技术中扮演着至关重要的角色。它负责以下几方面的工作: 1. **异步请求**:使用XMLHttpRequest或Fetch API发送多个异步请求,获取每个页面片段的数据。 2. **数据处理**:接收到服务器返回的...

    Ajaxifying, Caching and Pipelining Facebook Website

    Pipelining,即BigPipe,是Facebook提出的一种创新的页面渲染技术。传统网页加载时,所有组件(如HTML、CSS、JavaScript等)通常是串行下载的,而BigPipe则将页面拆分为多个部分(称为“管道”),并并行地分发这些...

    Facebook早期架构设计以及缓存系统

    4. **BigPipe**:为了解决页面加载速度问题,Facebook推出了BigPipe技术,它将网页分割成多个小部分并异步加载,显著提高了用户体验。 5. **数据库优化**:Facebook早期使用MySQL,但随着数据量的增长,他们引入了...

    node.js实现BigPipe详解

    【BigPipe技术详解与Node.js实现】 BigPipe是由Facebook开发的一种网页加载优化技术,旨在显著提升用户在浏览网页时的加载速度。它通过将页面分割为多个独立的部分(称为Pagelets),并利用HTTP的流式传输特性,...

    nodejs实现bigpipe异步加载页面方案

    BigPipe 技术,最初由 Facebook 提出,是一种有效的页面异步加载策略,它能显著降低页面加载时间,尤其是在处理复杂、数据丰富的动态页面时。本文将探讨如何使用 Node.js 结合 BigPipe 来实现这一技术,并讨论其优...

    著名网站架构设计(包括Facebook Google Amazon

    随着时间的发展,Facebook引入了“BigPipe”技术,它将网页加载分成了多个小部分,实现了按需加载,显著提高了页面加载速度。此外,Facebook还广泛使用了分布式缓存系统Memcached和NoSQL数据库HBase,以及图数据库...

Global site tag (gtag.js) - Google Analytics