坚信科学,分享技术

2018全新版本,未来在blog.54chen.com更新博客!

>>>尝试更加利于阅读的2014版科学院,以后都在新版上写。

rose手册第三章八节:controller层:门户必备pipe支持

rose

3.8.1 什么是pipe?
------------------
* pipe起源于facebook的工程师对他们网页提速的方案:将网页分解为Pagelets的小块(在rose叫做window的小块),然后通过后端多重管道运行,以达到性能的最佳。
* pipe巧妙使用了http 1.1连接有timeout的机制,充分使用一次http连接来传递数据。
* pipe可使用户在大多数浏览器中感受到延迟减少了一半。

3.8.2 与facebook的bigpipe相比rose pipe如何?
--------------------------------------------
* fb并未在开源项目中公布过使用方法
* bigpipe神似是php+js搞定的
* rose pipe可以自由选择线程池大小,完全出自上一节的portal的基础
* 完全实现bigpipe功能,天然的对业务开发者透明

3.8.3 看实例
------------

HelloController.java

  1. @Get("/3.8")  
  2. public String pipe(Pipe pipe) {  
  3.     pipe.addWindow("p1""/wp1");  
  4.     pipe.addWindow("p2""/wp2");  
  5.     return "pipe";  
  6. }  

* 长得是不是很像上一节里提供的action?
* 不同在于jsp文件中:

  1. <%@ page contentType="text/html;charset=UTF-8"%>  
  2. <%@ taglib uri="http://paoding.net/rose/pipe" prefix="rosepipe"%>  
  3.   
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  5. <html>  
  6. <head>  
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  8. <title>portal/pipe演示信息</title>  
  9. <script type='text/javascript' src='/js/rosepipe.js'></script>  
  10. </head>  
  11. <body>  
  12.   
  13. portal/pipe演示信息:  
  14. <br>  
  15. <div id="p1"></div>  
  16. <br>  
  17. <div id="p2"></div>  
  18.   
  19. </body>  
  20. </html>  
  21. <rosepipe:write>${p1}</rosepipe:write>  
  22. <rosepipe:write>${p2}</rosepipe:write>  

* 当使用jsp文件时,需要在尾部使用rosepipe:write标签
* 如果是使用vm文件,可以不写这个标签

3.8.4 总结
----------

* 上述代码中p1 p2两个window会同时在多个线程中执行,如果是portal,那会多个线程执行完成一起返回,而pipe则会用js反写的方式,一个线程一个线程地返回给用户。
* pipe是个好物件
* 使用时jsp一定不要忘记尾部的标签
* 使用时web.xml一定不要忘记声明使用的线程池大小
* 久经考验

文中所提及代码均在 https://github.com/XiaoMi/rose/tree/master/rose-example 提供。
常期更新版本在:https://github.com/XiaoMi/rose/tree/master/chapter_3_8


原创文章如转载,请注明:转载自五四陈科学院[http://www.54chen.com]
本文链接: http://www.54chen.com/java-ee/rose-3-8.html

This entry was posted in java and tagged . Bookmark the permalink.

13 Responses to “rose手册第三章八节:controller层:门户必备pipe支持”

  1. qintao 说:

    是不是可以这样理解,portal比传统好在可以多线程处理页面中的不同模块,pipe在此基础上可以分别写出不同的模块。文中说“如果是portal,那会多个线程执行完成一起返回”,那么在圣战中那种页面中显示一部分是怎么产生的?每个线程都设定了过期时间?

  2. qian 说:

    "pipe则会用js反写的方式,一个线程一个线程地返回给用户",js反写是什么意思?pipe模式下通过什么样的方式返回单个window呢?chunked http?

    • 54chen 说:

      js反写类似document.write("xxx"),在运行的例子代码中有一个pipe.js,是必须的。是chunked。

      • qian 说:

        多谢!
        还想问下,rose pipe的技术目前有运用在人人网中吗?页面加载加速效果如何?
        另外,关于服务端和浏览器计算的并行能实现BigPipe的功能和效果吗?

        • 54chen 说:

          这和bigpipe是一模一样的,而且按照fb官方的说明,他们应该没有在rosepipe里开发这样方便,速度上,号称是人肉感觉提升一倍页面速度。

          • qian 说:

            多谢,看了源码大概明白了。

            还是想问下,目前rosepipe的技术有那个可以直接访问的网站使用了吗?人人的首页从wireshark抓包上分析,感觉并没有使用该技术。

          • 54chen 说:

            一年半之前我还在人人网的时候page.renren.com中使用了,现在不详。首页这些地方大量使用了portal。

      • qian 说:

        BigPipe的设计中,返回的是JSON格式的内容片断,采用JS解析,这样可以不用按照HTML页面内的顺序加载模块,亦可并行加载模块。Rose Pipe的设计中仍用chunked的形式返回HTML,是不是必须按序且不能并发加载?

        • 54chen 说:

          那应该是我们理解不一致,你可以尝试一下rose-demo: https://github.com/XiaoMi/rose/

          rose pipe也是返回的json,通过js回写到固定的id上,只不过json的返回在于html的末尾,先完成的线程先给浏览器输出js,完成回写过程,这个过程其实是一次http请求的输出,非常类似标准的http chunked。

  3. li 说:

    在我的机器上跑了一下example中给出的例子,发现每次访问pipe请求前端页面总是一直转圈的状态,后端log显示:
    (PipeImpl.java:203) (firing 'weather' : add to waiting list)
    是什么地方没配对么?

    • 54chen 说:

      尽可能使用resin4.0.13左右作为容器。

      • li 说:

        resin4.0.36 会报exception,resin3能跑但有点问题

        另外,如果在返回前sleep一段时间,前端就能正确显示,如果sleep(1)则虽能显示,但显示的两个window都是同样内容

        public String pipe(Pipe pipe) {
        pipe.addWindow("weather", "/p1");
        pipe.addWindow("todo", "/p2");
        //Thread.sleep(10); // 这里直接返回前端会转圈,sleep之后返回却没问题,原因未知
        return "pipe";
        }

Leave a Reply