rose pipe–一次对http技术的伟大革新实现(54chen乱弹版)

标签: 架构研究 portal renren rose | 发表时间:2010-08-14 18:23 | 作者:54chen sheng
出处:http://www.54chen.com

以下内容由[五四陈科学院]提供

网站速度一直是互联网公司所关注的核心目标之一,作为SNS网站更是这样。来自世界第一大的打不开的SNS网站facebook的工程师日志中提到,BigPipe: Pipelining web pages for high performance。

原文在墙外,豆瓣有存根,地址为http://9.douban.com/site/entry/139173635/

来自infoq的一篇资料报道:http://www.infoq.com/cn/news/2010/08/bigpipe-facebook-optimize
它本意是充分利用http,将用户感受到的延迟时间降低一半,是如何做到的呢,下面由54chen流水记账一篇解释实现原理。院内曾经由人人网架构师王志亮大侠发表过一篇文章,地址是http://www.54chen.com/architecture/rose-open-source-portal-framework.html,本文将以此例中的项目举例。

HTTP协议
HTTP是一个客户端和服务器端请求和应答的标准,尽管TCP/IP协议是互联网上最流行的应用,HTTP协议并没有规定必须使用它和(基于)它支持的层。 事实上,HTTP可以在任何其他互联网协议上,或者在其他网络上实现。HTTP只假定(其下层协议提供)可靠的传输,任何能够提供这种保证的协议都可以被其使用。
在这里重新解释HTTP是为了后面做铺垫,一次http访问的过程如下:
1.打开一个连接后,客户机把请求消息送到服务器的停留端口上,完成提出请求动作;
2.服务器在处理完客户的请求之后,要向客户机发送响应消息;
3.客户和服务器双方都可以通过关闭套接字来结束TCP/IP对话。
在使用java的ServletResponse的时候,往往都是如下的操作返回结果到用户:

out.write(sb.toString());
out.flush();
out.close();

传统的WEB请求

以图1为例,一个WEB项目往往由不同的部分组成,不同的格局里往往代表需要从不同的数据表里去取不同的数据。
renren page
图1 人人网公共主页页面

一个用户来访问这个页面,按照传统的做法,其流程图可能是如图2这样的。
54chen:rose pipe
图2 一个传统的http请求过程
在图2中可以看到,一次打开网站页面的过程中,请求发到后端进行了处理(1和2步),只有当后端的取数据操作(2步)全部完成的时候,才可能进入第3步,向用户返回组装好的html页。如果说图1中一共有四个模块,对应后台有四条sql语句的话,那么,必须这四条sql语句全部返回了结果,才可能让用户看到页面。

pipe
pipe技术充分利用了前后端技术。将一个页面里的多个模块分成不同的window,多线程取数据的操作,然后再充分利用http请求的连接,将原来的输出,从一次flush变成多次flush:

out.write(“基础的dom”);
out.flush();
//数据一准备好时
out.write(“js带数据一”);
out.flush();
//数据十二准备好时
out.write(“js带数据二”);
out.flush();
out.close();

其过程如图3所示:
54chen:rose pipe
图3 pipe的请求过程
借用big pipe的代码,第一次是输出的:

<div>
<div id=”left_column”>
<div id=”pagelet_navigation”></div>
</div>
<div id=”middle_column”>
<div id=”pagelet_composer”></div>
<div id=”pagelet_stream”></div>
</div>
<div id=”right_column”>
<div id=”pagelet_pymk”></div>
<div id=”pagelet_ads”></div>
<div id=”pagelet_connect”></div>
</div>
</div>

当有了完整的dom结构时,浏览器就会开始显示没有数据的框架了。

后面的数据每次都以js继续发送到页面中,浏览器收到即开始写入:

<script type="text/javascript">
big_pipe.onPageletArrive({id: “pagelet_composer”, content=<HTML>, css=[..], js=[..], …})
</script>

性能
这种显示方式的性能,再借用facebook的图来表示之,如图4:
facebook:pipe

相关 [rose pipe http] 推荐:

rose pipe–一次对http技术的伟大革新实现(54chen乱弹版)

- sheng - 五四陈科学院-坚信科学,分享技术
以下内容由[五四陈科学院]提供. 网站速度一直是互联网公司所关注的核心目标之一,作为SNS网站更是这样. 来自世界第一大的打不开的SNS网站facebook的工程师日志中提到,BigPipe: Pipelining web pages for high performance. 原文在墙外,豆瓣有存根,地址为http://9.douban.com/site/entry/139173635/.

Pipe——Python 的中缀语法库

- cong - 赖勇浩的编程私伙局
本文基本上是翻译这篇文章(http://dev-tricks.net/pipe-infix-syntax-for-python). 通过 Pipe 模块,就能够使用 Python 用上中缀语法.

rose手册第一章:入门指引

- - 五四陈科学院-坚信科学,分享技术
以下内容由 [五四陈科学院]提供. 人人网、糯米网释出的、开源的高效Java web开发框架. 在小米米聊服务端再次被验证和使用. 一个从零开始的创业公司,在大家技术背景不一的情况下,rose很简单快速地传达到了大家中间. 本手册致力于让php开发人员也能快速使用上java开发高性能服务. 基于IoC容器 (使用Spring 2.5.6).

HTTP Headers 入门

- johnny - Time Machine
非常感谢 @ytzong 同学在twitter上推荐这篇文章,原文在此. 本文系统的对HTTP Headers进行了简明易懂的阐述,我仅稍作笔记. 什么是HTTP Headers. HTTP是“Hypertext Transfer Protocol”的所写,整个万维网都在使用这种协议,几乎你在浏览器里看到的大部分内容都是通过http协议来传输的,比如这篇文章.

HTTP基础

- - ITeye博客
HTTP的结构主要包括下面几个要点:. HTTP的版本主要有1.0,1.1 和更高版本.    1.1 及以上版本允许在一个TCP连接上传送多个HTTP协议,1.0能 .    1.1 及以上版本多个请求和响应可以重叠,1.0不能.    1.1 增加了很多的请求头和响应头.     一个请求行,若干小心头,以及实体内容,其中的一些消息头和实体内容是可选的,消息头和实体内容需要空行隔开.

HTTP Header 详解

- - 博客园_Ruby's Louvre
HTTP(HyperTextTransferProtocol)即超文本传输协议,目前网页传输的的通用协议. HTTP协议采用了请求/响应模型,浏览器或其他客户端发出请求,服务器给与响应. 就整个网络资源传输而言,包括message-header和message-body两部分. 首先传递message- header,即 http header消息.

HTTP/2 in Netty

- -
Here, we created a context for the server with a JDK SSL provider, added a couple of ciphers, and configured the Application-Layer Protocol Negotiation for HTTP/2..

Amoeba+rose:开源项目搭建大型网站可扩展构架实记

- corleone1969 - 五四陈科学院-坚信科学,分享技术
以下内容由[五四陈科学院]提供. java是一把双刃剑,可以很重地伤人,亦可很重地自伤. 曾在一处见到,淘宝在长期使用java构建web项目后,得出一个结论:积重难返. 实际工作经验得到的结论,积重难返的原因,往往不是java本身的缘故,而是团队成员基础积累参差不齐,许多次的“一不小心”积累成了最终的结果.

从tcp原理角度理解Broken pipe和Connection reset by peer的区别

- - 你假笨
  在讲具体的原因之前,我们有必要补充下tcp这块的一些基础知识,我们都知道tcp通信有三次握手和四次挥手,网上介绍的文章也一大堆,图我也懒得画了,直接网上找一个图给大家.   介绍了基础原理之后,再介绍下抓包工具,tcpdump,这工具对你了解tcp的整个过程会非常有帮助,在你无法调试tcp实现的情况下这个工具自然也是必不可少的,具体用法网上有很多介绍,直接从man page上也可以看到详细的介绍,我也不多说啦,下面的截图就是tcpdump根据tcp通信过程获取到的.