论坛首页 Java企业应用论坛

(业务层)异步并行加载技术分析和设计

浏览 15887 次
精华帖 (9) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (2)
作者 正文
   发表时间:2011-02-23  
royaki 写道
比如有10个线程请求数据,原本情况是10个线程分别进行处理,分担压力。
使用LZ这种方式以后10个线程的压力会变小,但是executor就要处理大量的请求数据,这样来看总体的耗时反而有可能增加。

而且,并没有看到比ajax明显改善的地方。

不知道是不是我理解的不对.....


理解有点偏差,原本的一个work线程,起了n个线程并行加载后,因为由线程调度,所有线程的总的耗时是会有增加的。 但这总的耗时是n个线程的时间之和,一个请求总的处理时间确是这max(单个Thread的响应时间),一个页面请求的响应时间就会减小,客户体验就好。

就是以cpu的运算的代价,提升系统的单次请求的响应时间

0 请登录后投票
   发表时间:2011-02-23  
yashironan 写道
如果没理解错的话,可切分的多个子task,分别定义成FutureTask由Executor去执行,要求子task之间依赖性较低。用在合适的场景,确实效果不错


task越离散,多快数据之间没有依赖关系,也越接近于ajax可以实施的范围。

目前是支持依赖关系的处理,如果子task返回的对象model,存在一定的依赖关系,也只影响整个依赖的这一条链表的请求,其他不相关的同样是能走异步并行加载。

可以说业务越复杂,外部接口调用越多,提升的空间就越大
0 请登录后投票
   发表时间:2011-02-23  
ModelA modelA = serviceA.getModel(); 
ModelB modelB = serviceB.getModel(modelA.getResult()); 
ModelC modelC = serviceC.getModel(modelB.getResult()); 


这种情况????
0 请登录后投票
   发表时间:2011-02-23   最后修改:2011-02-23
opal 写道
ModelA modelA = serviceA.getModel(); 
ModelB modelB = serviceB.getModel(modelA.getResult()); 
ModelC modelC = serviceC.getModel(modelB.getResult()); 


这种情况????


针对这种情况,就回归到最原始的串行请求了,因为所有的服务处于一条的依赖关系链中。

总的请求的响应时间等于依赖关系链的所有服务请求之后。

新的例子:
ModelA modelA = serviceA.getModel(); 
ModelD modelD = serviceD.getModel();  //加入多这么一次请求
ModelB modelB = serviceB.getModel(modelA.getResult()); 
ModelC modelC = serviceC.getModel(modelB.getResult()); 


加入多了一次modelD的请求,这个请求的响应时间就可以被“挤“出来了,最后总的响应时间就=max(serviceD , serviceA+serviceB+serviceC);

因为我们的代码开发,存在很多的情况就是调用服务取到了结果,并不立即去使用,这样就有一定的提升空间了
0 请登录后投票
   发表时间:2011-02-23  
页面的几个调用有业务上的先后顺序,通过并行处理的话可能会乱序,这个方面你怎么考虑的
0 请登录后投票
   发表时间:2011-02-23  
我做过类似的一个实现,是做接口服务调用,
主要是用jdk并发包中的BlockingQueue和Future机制,
基本是按生产者-消费者模型,有一个线程会执行定时任务,检测Future是否拿到结果,和你的modelA.isOk())作用应该类似。
0 请登录后投票
   发表时间:2011-02-23  
大任务包含分支任务分解,可以参考下fork/join并行分解模型
0 请登录后投票
   发表时间:2011-02-23  
donglee 写道
我做过类似的一个实现,是做接口服务调用,
主要是用jdk并发包中的BlockingQueue和Future机制,
基本是按生产者-消费者模型,有一个线程会执行定时任务,检测Future是否拿到结果,和你的modelA.isOk())作用应该类似。



理念上貌似有所不同吧,isOk()这是我随意写的一个内容。整套机制目前是无嵌入性,不需要应用代码实现任何接口或者啥的。

不存在一个定时任务去检查。 而是在你的model想要进行一个getXXX()方法调用时,再去检查future的结果(已拿到就直接返回,没拿到就阻塞), 所以这时的检查是一个lazy的过程。
0 请登录后投票
   发表时间:2011-02-23  
tutu1982 写道
页面的几个调用有业务上的先后顺序,通过并行处理的话可能会乱序,这个方面你怎么考虑的



主文档中,已经有提到。

=============================
引入的问题:
   但同样,引入并行加载的设计后,需要考虑的一个点就是如果A和B的数据之间是有一定的依赖关系时怎么处理。
   例子
Java代码
if(modelA.isOk()){//先依赖modelA的请求 
    modelB.getXXX() 


一种解决方案: 半自动化处理。 任何异步并行加载的时机点,全都取决于代码编写的顺序。 如果有依赖关系的存在,比如例子中的B依赖A的结果,则B会阻塞等待至A的结果返回。 A和B的处理就又回归到一个有顺序序的请求处理
0 请登录后投票
   发表时间:2011-02-23  
嗯,半自动确实能解决,但这样就给业务开发人员带来了一定的负担,我一直在思考能否对业务开发人员做到全透明
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics