要处理的情况:
一次用户请求,后台要处理业务:
step1,查询并大数据且复杂的业务处理,得到结果集A;
step2,基于结果集A,调用web service查询结果集B
step3,将A和B显示在页面上
之前的方案就是在step1完成后就直接进入step3显示A的信息,然后在页面渲染完后,用ajax,基于页面上的A的信息,异步到后台调用web service查询结果集B,然后再重画部分页面。这个方案是常用的提高用户体验的方法,减少用户的等待时间,尽早的将部分有效的信息响应给用户,后续用ajax逐步补充剩下的信息。
这种方案确实帮我们提高了用户体验,不过现实中的问题还有。。那就是step2的通过web service去查询结果集B的时间有些长,具体说,就是在渲染完第一步结果集A后,我们在页面前端放置了些转动的圈圈类表示仍有部分信息正在loading,而这个圈圈转动的时间有点长,有时候用户看完结果集A后,还没渲染。。这确实头大,在web service调用那块进行了tuning,结果并不乐观。
后来看了facebook的bigpipe技术,其使得用户感受到的延迟时间降低了一半,具体的关于bigpipe的信息,可参考:
http://www.searchtb.com/2011/04/an-introduction-to-bigpipe.html
具体的bigpipe实现在我们项目中实现难度较大,评估了下还是放弃了,不过相比较正常的ajax的处理,bigpipe从最终实现上至少减少了部分数据传输时间,部分页面渲染时间,和不少于一次的服务器再次交互发起时间等,所以我思考是否可以将上面的结果集B的查询还是放在第一次查询的请求中进行,只不过可以另起一个线程去跑,启动后,拿结果集A去渲染页面,本次交互结束,后续仍然通过ajax来取回结果集B,类似于将bigpipe的部分思路通过服务器代码实现,手工完成。具体的执行步骤:
1.用户发起请求
2.服务器端进行step1的操作,得到结果集A
3.生成一个token,并另起线程,将结果集A及token传入这个线程,进行B的查询。
注意:这里的线程不能源于主线程,否则当主线程结束时,子线程似乎也断了,可以独立出一个线程池,从线程池中取线程使用。在新线程中,如果B查询结束,以token为key,以B为value存在session里.
4.处理结果集A的数据结构,便于页面渲染,然后返回
5.根据返回信息渲染页面,并发出ajax请求,参数为token
6.服务器端根据token去session里取得结果集B,如果这时还没有,则设置等待,等待时间设置为个适当的时间,譬如最多20S,还没出结果可以当成没有结果集B匹配。否则将B返回渲染页面。
上面的实现步骤相比较正常的ajax处理,省去了4,5两步的时间,目前已经在我们产品线上运行。
当然,这种方案更适合并发响应少的应用上。
写得有点乱,不过也只是个小尝试,并非什么技术难点,只是做个笔记。
分享到:
相关推荐
BigPipe技术java源代码,实现页面的单线程加载,和多线程加载,减少页面的加载时间
Bigpipe命令_V45_comref2
已调试成功,并做了优化,类似新浪微博BIGPIPE
bigpipe 基于struts2标签实现
NULL 博文链接:https://secondhrc.iteye.com/blog/1837984
用asp.net mvc2.0 实现bigbipe技术,这只有C#部份代码,javascript部分还未实现,以后再补吧。
NET BIGPIPE 实现,前后台代码。
bigpipe对应的tmsh命令及linux对应的tmsh命令,TMSH命令行操作bigpipe对应的tmsh命令及linux对应的tmsh命令
net bigpipe 例子,调试成功
网上几乎没有用 node.js 实现的文章,实际上,不止于 node.js,BigPipe 用其他语言的实现在网上都很少见。以至于这技术出现很久以后,我还以为就是整个网页的框架先发送完毕后,用另一个或几个 ajax 请求再请求页面...
bigpipe-demo1 简单的 bigpipe 演示
自己实现的bigpipe,C# 实现,比较简单,可以正常运行
Koa Bigpipe演示生成基础koa工程使用koa-bigpipe作为bigpipe库默认使用pug模板引擎 jQuery + bigpipe.js $ nvm use 7Now using node v7.9.0 (npm v4.2.0)$ npm start
BigPipe与AJAX的比较 AJAX主要是XMLHttpRequest,前端异步的向服务器请求,获取动态数据添加到网页上。这样的往返请求需要耗费时间,而BigPipe技术并不需要发送XMLHttpRequest请求,这样就节省时间损耗。减少请求...
bigpipe-example, 使用koa和组件的[DEPRECATED] BigPipe BigPipe示例 使用 koa 和组件插件构建的应用程序,实现了facebook的 BigPipe 。给定 subreddit,这里应用程序执行以下操作:一个基于 horizontal-grid-...
其思路是使用多个可重用的网页部件来组合整个网页。这些部件称为 Pagelets ,然后通过在服务器和浏览器上进行不同的执行方法来组合。这使得前端页面可以按进度进行内容的渲染,提升了前端的速度。Most web ...
NULL 博文链接:https://liaoke0123.iteye.com/blog/2312795
用C#实现的仿新浪微博首页数据的加载方式。测试了下谷歌和IE8都支持,同样的数据处理量:BigPipe加载方式耗时1.22秒,传统方式加载3.01秒。
用asp.net mvc2.0 实现bigbipe技术,该版修改了异步线程flush html错乱的bug与加入了bigpipe js框架。非常感谢http://my.csdn.net/SeaSunk提供的js框架。
测试我自己编写的koa-bigpipe-middlewary, 模拟bigpipe渲染技术 环境 node >= 8.x 执行 npm install node app.js 打开localhost:9000