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消息.

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

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

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

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

HTTP负载测试

- - 博客 - 伯乐在线
英文原文: ON HTTP LOAD TESTING 来源: oschina. 有很多人在谈论HTTP服务器软件的性能测试,也许是因为现在有太多的服务器选择. 这很好,但是我看到有人很多基本相同的问题,使得测试结果的推论值得怀疑. 在日常工作中花费了很多时间在高性能代理缓存和源站性能测试方面之后,这里有我认为比较重要的一些方面来分享.