论坛首页 Java企业应用论坛

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

浏览 15888 次
精华帖 (9) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (2)
作者 正文
   发表时间:2011-02-24  
tutu1982 写道
其实我说的自动识别依赖关系不是指

if(modelA.getXX()){ 
    modelB = serviceB.getModelB(); 
}

这一个逻辑块,我关心的是如何能够动态识别得到if(?){}这个逻辑,这个逻辑才是服务接口间的依赖关系的表达,如果这个逻辑需要手写的话,那对开发人员的编码思维是强侵入的。


主要看你这个依赖是怎么定义了。

比如有这么一个登录的业务,首先验证帐号密码,在密码验证通过后,我需要更新一下群发消息通知一下别人。

这么一个需求,正常的编码也肯定会是
if(modelA.isLoginSuccess()){
  modelB  = serviceB.sendMessage()
}

这是一个业务,肯定需要开发人员进行编码,如果想单纯的依赖配置文件,我觉得反而对老系统有嵌入性了。
目前的想法,就是老的逻辑代码怎么写,加了异步加载后代码逻辑尽量都保持一致。

同样异步并行加载会存在一定技术上的难以规避的问题,比如如果直接使用modelA == null进行判断,因为异步返回的是一个假的,具体结果目前无法控制。

0 请登录后投票
   发表时间:2011-02-24   最后修改:2011-02-24
cljhyjs 写道
LZ的想法很有创意,但是考虑到如果把这块功能抽象,采用类似拦截机制的方法在业务服务层做封装,可能需要考虑的问题会很多。 毕竟抽象层无法判断各个方法之间的依赖关系,即使采用显式的等待方式,可能也会增加程序的复杂度,或者实现封装代码块的复杂度。
   建议采用半自动化方式,由开发人员自己决定是否将方法投入到异步并行的容器中。就像spring中的ECcache、jbosscache配置使用一样。


这个你可以看看主文中的代码例子。

因底层技术是采用字节码增强方式,包括service和model都会织入一定的代码,具体开发者是感觉不到的。就和正常的写代码是一样的方式,至于依赖关系的串行处理,也是植入代码内部的。

原先设计的理念就是尽量做到无嵌入,对开发透明。

理想的情况就是普通开发人员完成业务编码开发后,由项目的技术经理或者架构师,配置一份xml,决定哪些service的哪几个方法要进行异步并行加载。
0 请登录后投票
   发表时间:2011-02-24  
agapple 写道
cljhyjs 写道
LZ的想法很有创意,但是考虑到如果把这块功能抽象,采用类似拦截机制的方法在业务服务层做封装,可能需要考虑的问题会很多。 毕竟抽象层无法判断各个方法之间的依赖关系,即使采用显式的等待方式,可能也会增加程序的复杂度,或者实现封装代码块的复杂度。
   建议采用半自动化方式,由开发人员自己决定是否将方法投入到异步并行的容器中。就像spring中的ECcache、jbosscache配置使用一样。


这个你可以看看主文中的代码例子。

因底层技术是采用字节码增强方式,包括service和model都会织入一定的代码,具体开发者是感觉不到的。就和正常的写代码是一样的方式,至于依赖关系的串行处理,也是植入代码内部的。

原先设计的理念就是尽量做到无嵌入,对开发透明。

理想的情况就是普通开发人员完成业务编码开发后,由项目的技术经理或者架构师,配置一份xml,决定哪些service的哪几个方法要进行异步并行加载。


这也是一种方法,何必不让开发者自己在applicationContext.xml中配置,决定哪些service以及方法需要异步并行加载呢?
0 请登录后投票
   发表时间:2011-02-24   最后修改:2011-02-24
cljhyjs 写道
agapple 写道
cljhyjs 写道
LZ的想法很有创意,但是考虑到如果把这块功能抽象,采用类似拦截机制的方法在业务服务层做封装,可能需要考虑的问题会很多。 毕竟抽象层无法判断各个方法之间的依赖关系,即使采用显式的等待方式,可能也会增加程序的复杂度,或者实现封装代码块的复杂度。
   建议采用半自动化方式,由开发人员自己决定是否将方法投入到异步并行的容器中。就像spring中的ECcache、jbosscache配置使用一样。


这个你可以看看主文中的代码例子。

因底层技术是采用字节码增强方式,包括service和model都会织入一定的代码,具体开发者是感觉不到的。就和正常的写代码是一样的方式,至于依赖关系的串行处理,也是植入代码内部的。

原先设计的理念就是尽量做到无嵌入,对开发透明。

理想的情况就是普通开发人员完成业务编码开发后,由项目的技术经理或者架构师,配置一份xml,决定哪些service的哪几个方法要进行异步并行加载。


这也是一种方法,何必不让开发者自己在applicationContext.xml中配置,决定哪些service以及方法需要异步并行加载呢?



支持的阿,你看下首页中关于 扩展一:AsyncLoadFactoryBean 描述这一块。

基于spring FactoryBean接口,配置方式就是纯spring ioc那一套,对哪个service的哪些方法进行异步加载。
0 请登录后投票
   发表时间:2011-02-24  
donglee 写道
大任务包含分支任务分解,可以参考下fork/join并行分解模型


根fork/join是两码事,fork/join主要用于处理一些主任务拆分成对等子任务。 而异步加载需要解决的是未知服务的并行加载,两个服务之间可能还存在数据上的依赖关系。
0 请登录后投票
   发表时间:2011-02-25  
对于楼主说的这种类型的:
if(modelA.isOk()){//先依赖modelA的请求 
    modelB.getXXX() 

确实可以异步加载,但更常见的是如下依赖类型的:
result = modelA.xxx();
modelB.xxxxx(result);
对于这种异步没用吧?
0 请登录后投票
   发表时间:2011-02-25  
winit 写道
对于楼主说的这种类型的:
if(modelA.isOk()){//先依赖modelA的请求 
    modelB.getXXX() 

确实可以异步加载,但更常见的是如下依赖类型的:
result = modelA.xxx();
modelB.xxxxx(result);
对于这种异步没用吧?


因目前技术实现的局限性,如果服务接口返回的是java的原始类型,暂不支持异步并行加载,final对象后续可考虑使用jdk proxy处理,目前代码没支持。

modelB.xxxx(result); 这里如果你的result是个对象类型时Integer,String等也可以支持。
0 请登录后投票
   发表时间:2011-02-25  
呵呵,谢谢及时回复,那我就不明白了,既然modelB的加载(bbb方法的执行)依赖于ModelA执行的结果,A没有返回之前,B是加载不了的,实质上还是串行吧?
result = modelA.xxx();
modelB.bbb(result);
0 请登录后投票
   发表时间:2011-02-25   最后修改:2011-02-25
winit 写道
呵呵,谢谢及时回复,那我就不明白了,既然modelB的加载(bbb方法的执行)依赖于ModelA执行的结果,A没有返回之前,B是加载不了的,实质上还是串行吧?
result = modelA.xxx();
modelB.bbb(result);


可能表述的依赖没讲清楚。

A服务依赖B,指A服务的请求发起或者请求参数,取决于B的返回的结果。

那假定这个B是一个pojo bean,那依赖结果的概念是指依赖bean具体的属性。

从技术实现上说,在调用serviceA获取结果的时,我会直接返回一个假的LazyLoad产生的mock对象。此时对应的属性值全为null,在你具体依赖到该modelA的属性数据时,就会有一个阻塞等待,转为串行的过程。

不知道说明白了没? 貌似很多人对这块有一定的理解偏差。

最后再看你的modeB.bbb(result)。 你这时的代码应该还不产生一种依赖关系,所以这里还是不会有阻塞,直接过去
0 请登录后投票
   发表时间:2011-05-03  
tps 是什么东西
0 请登录后投票
论坛首页 Java企业应用版

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