`
agapple
  • 浏览: 1597835 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

(业务层)异步并行加载ChangeLog

阅读更多

继上一篇:  (业务层)异步并行加载技术分析和设计

 

目前已经在google code上新建了一个project,也在逐步的完善和加强并行加载的功能,这里记录一下ChangeLog。

 

相关代码: https://github.com/agapple/asyncload , 有兴趣的同学可以一起参与,目前正在公司的应用中打算实施,逐步的在完善功能和解决一些兼容性的问题。

 

Change 1: (HandleMode模式修改)

AsyncLoadExecutor(并行加载的执行容器),修改了HandleMode模式,增加了CALLERUN,废弃了BLOCK。

HandleMode(针对并行加载队列满负荷时的一种处理模式):

  • CALLERRUN: 针对新的请求直接由调用者线程执行。即恢复为正常阻塞调用。
  • REJECT:针对新的请求直接抛出reject异常,比较暴力的处理方式。一般适用于需要进行资源控制,避免出现高并发
  • BLOCK: 针对新的请求直接进行阻塞,等待pool池中工作队列处理。 (已删除)

Change 2: (ThreadLocal支持)

为了异步并行加载,部分的代码块会由多个Thread执行,原先的ThreadLocal属性的模式已经不再有效。线程分为:caller thread(主线程,一般web应用为Jetty,Tomcat的Http工作线程) 和 runner thread(并行加载的执行线程)。

目前项目中支持在runner thread的可以正常获取ThreadLocal数据(caller thread运行中产生的ThreadLocal)。


简单设计:


ThreadLocal建议使用: 在异步加载中对ThreadLocal为只读,尽量不对其进行set操作。

伪代码:

try {
   threadLocal.put(object);
   serviceA.method(){ // 并行加载1 
        Object obj = threadLocal.get();
   }
   serviceB.method(){ // 并行加载2
        Object obj = threadLocal.get();
  }
} finally {
   threadLocal.remove(object);
}

说明:

1.  在所有的并行加载执行之前,完成threadLocal的设置,在最后完成threadLocal的清理。

2.  在各个并行加载容器中读取threadLocal信息。

 

针对一下的几种场景,使用ThreadLocal潜在风险:

1. serviceB依赖serviceA的ThreadLocal属性put。 因为A和B都是在并行的加载,所以很难确定执行的前后顺序。

2. caller线程依赖serviceA的ThreadLocal的属性put,因为A是一个并行加载,所以caller可能会优先于serviceA调用threadLocal

3. serviceA和serviceB都各自进行ThreadLocal属性的设置,因为执行顺序的不确定性和多Thread的执行,所以最后需要在caller线程进行合并,可能导致数据会丢失

 

Change 3 : (支持接口代理,解决final Service无法代理的问题)

1. 允许在构造代理工程时,设置targetClass。允许自定义cglib代理的目标class,而不是自动扫描对应service的class对象。

2. 使用template提交代码"闭包"的方式。

Change 4 : 处理超时时间<=0 等价于不进行超时控制

修改代码类:AsyncLoadResult

增加了对timeout<=0的逻辑判断,如果<=0,则调用future.get()进行处理,不进行超时控制。

 

Change 5 : 修改默认超时间,原先为3000毫秒改为0毫秒(意为不进行超时控制,保证对老业务处理兼容)

修改代码类:AsyncLoadConfig

原先默认超时时间为3000毫秒,但考虑在老系统上实施并行加载,程序员coding时意识不够,或者系统上线初期对timeout把握不够,所以这里考虑修改了默认的超时时间。

 

Change 6 : future针对timeout处理的bugfix

修改代码类:AsyncLoadResult

针对future.get(timeout, TimeUnit.MILLISECONDS); 针对出现TimeoutException时,需要进行cancel处理。

修改代码为:

try {
  // 使用cglib lazyLoader,避免每次调用future
  return future.get(timeout, TimeUnit.MILLISECONDS);
  }
 } catch (TimeoutException e) {
 future.cancel(true);
 throw e;
}

 

存在的注意点:

  因为透明的进行了多线程机制,原先的正常业务中并不会去处理Thread.interrupt() 和 InterruptException。

可能出现的一种现象:

  caller thread已经结束,但pool池中存在很多RUNNING的Thread线程。导致出现线程池不够用,该stop的没有stop。

解决方案:

   待定。目前暂未想到比较好的处理方案,因为需要对一个RUNNING的Thread线程执行一个stop操作,原先的Thread.stop(Throwable e)已经被@Deprecated,具体原因:http://download.oracle.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html

Change 7 : 新增newInstance方法,支持对不带默认空构造函数(constructor)的支持

为了支持复杂的业务系统,尽可能自适应。这里提供了一个增强Class.newInstance()方法。实现方式比较简单:

 

public static Object newInstance(Class type) {
// 1. 首先查找默认的空构造函数
// 2. 查找其他的构造函数,默认选取第一个
// 2.1 获取构造函数的参数类型,产生默认的参数值,处理原型和数组,对象等。
}

Change 8 : 新增基于spring inteceptor的实现,方便无嵌入的使用

 

        <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <!-- 自动配置代理 -->
   		<property name="optimize" value="false"/>
   		<property name="proxyTargetClass" value="false" />
        <property name="beanNames">
        	<list>
        		<value>asyncLoadTestServiceForInteceptor</value>
        	</list>
        </property>
        <property name="interceptorNames">
        	<list>
	            <value>asyncLoadInterceptor</value>
        	</list>
        </property>
     </bean>

 

 

Change 9 : 增加AsyncLoad相关接口定义,允许客户端提取内部状态

新增了两个接口类: 

 

  • AsyncLoadObject :  目前提供了_isNull(判断原始的model对象是否为空), _getStatus(获取并行加载的状态,时间点),_getOriginalClass(原始的class对象)
  • AsyncLoadService : 目前提供了_getOriginalClass(原始的class对象)
新增AsyncLoadUtils类,用于操作AsyncLoadObject和AsyncLoadService,一般不建议直接显示的直接使用,这样不方便以后的扩展。希望以后可以直接使用AsyncLoadUtils
 
--------------------------------------------------------------------------------------  
 
持续更新......

 

 

 

分享到:
评论

相关推荐

    异步并行加载工具Asyncload.zip

    长的外部环境单个请求处理基本都是在几十ms,最终的出路只能异步 并行,从而诞生了该开源产品项目介绍名称:asyncload译意: async cocurrent load语言: 纯java开发定位: 业务层异步并行加载工具包,减少页面...

    MATLAB 异步并行计算

    在“MATLAB 异步并行计算”这个主题中,我们将深入探讨如何利用MATLAB进行高效的异步并行处理,以及与多线程相关的知识。 **一、MATLAB并行计算基础** MATLAB的并行计算工具箱(Parallel Computing Toolbox)为...

    WPF异步加载DataGrid

    在本文中,我们将深入探讨如何在WPF(Windows Presentation Foundation)中实现DataGrid的异步加载,采用MVVM(Model-View-ViewModel)设计模式。MVVM是一种流行的设计模式,它将用户界面(View)、业务逻辑...

    WPF中ItemsControl的异步加载

    异步加载的核心在于将数据加载过程与UI线程分离,这样即使数据加载耗时较长,也不会阻塞UI更新。在WPF中,我们可以通过以下步骤实现ItemsControl的异步加载: 1. 创建一个后台任务:可以使用Task.Run或者使用...

    matlab异步并行计算.rar_MATLAB 并行_matlab 并行计算_matlab并行_分布式计算_异步并行 matl

    在MATLAB中,异步并行计算是一种提升计算效率的重要技术,尤其对于处理大量数据或执行计算密集型任务时。本资源"matlab异步并行计算.rar"着重介绍了如何利用MATLAB的`parfeval`函数和`distributed`工作空间进行这样...

    unity实现场景异步加载并带有加载的进度条

    unity实现场景异步加载并带有加载的进度条,实现场景平稳加载,返回的加载进度为匀速加载。非常适合用在要加载大型场景的情况下。

    资源的异步动态加载问题

    在IT行业中,资源的异步动态加载是一种优化网页性能的关键技术。这主要涉及到JavaScript的异步编程和资源管理,特别是对于大型应用或者高流量网站,有效地加载和管理资源可以显著提高用户体验。以下是对标题和描述中...

    Android异步加载图片例子

    在Android开发中,异步加载图片是一项至关重要的技术,尤其对于那些包含大量图像的移动应用而言,如社交网络、电商应用等。异步加载能够提高用户体验,避免UI线程阻塞,防止应用出现"卡死"现象。在这个"Android异步...

    接口回调之异步网络加载

    在编程领域,尤其是移动开发和Web开发中,接口回调和异步网络加载是两个至关重要的概念,它们在实现应用程序的动态数据获取和更新时起到关键作用。本文将深入探讨这两个主题,以及它们如何协同工作来优化用户体验。 ...

    图片异步加载,照片墙,异步加载listview图片2

    在Android应用开发中,图片异步加载是一种常见的优化技术,特别是在构建类似照片墙或ListView这样的大量图片展示场景中。这个话题主要关注如何有效地处理图片资源,避免UI阻塞,提高用户体验。以下是对"图片异步加载...

    异步数据加载时,所用的等待组件,JS源码,类似于UI Block

    在开发Web应用时,异步数据加载是一种常见的技术,它能提高用户体验,使得页面在后台获取新数据的同时,用户仍然可以进行其他操作。"异步数据加载时,所用的等待组件,JS源码,类似于UI Block"这个标题揭示了一个...

    js 异步加载js, css文件

    当项目js(css)文件使用越来越多,js 文件的加载也成了性能上的一个问题,此资源能够在页面全部加载完成后异步加载js等资源文件,它可以顺序加载资源列表,也可以并发加载资源列表,它包含一个方法调用接口:...

    C#异步并行编程示例

    在C#编程中,异步并行编程是提高应用程序性能和响应能力的关键技术。本文将深入探讨`Thread`、`Task`、`async`和`await`关键字在C#中的应用,以及它们如何协同工作来实现高效且无阻塞的程序执行。 1. **线程...

    wpf 异步加载图片完成后再显示

    在WPF(Windows Presentation Foundation)应用开发中,异步加载图片是提高用户体验的关键技术,特别是在处理大尺寸或者网络延迟较大的情况下。本知识点将详细讲解如何实现wpf异步加载图片并在加载完成后显示。 ...

    layui异步加载table表中某一列数据的例子

    在本篇文章中,介绍了如何利用layui框架实现异步加载table表中某一列数据的示例。layui是一个轻量级的前端UI框架,提供了一整套的解决方案,方便前端开发者快速构建界面。本文将重点阐述如何在layui框架下,利用异步...

    C#异步操作 异步查询数据库 异步处理一行一行加载数据

    本主题将深入探讨C#中的异步概念,如何异步查询数据库,以及如何异步处理一行一行加载的数据。 首先,理解C#中的异步编程基础至关重要。C#引入了`async`和`await`关键字来简化异步代码的编写。`async`修饰符标记一...

    异步加载数据

    异步加载,主线程,子线程的关系

    js异步加载代码

    JavaScript 异步加载是优化网页性能的关键技术,它能让页面在不等待脚本执行的情况下继续渲染,从而提高用户体验。在现代网页开发中,由于 JavaScript 文件的体积越来越大,同步加载(即默认方式)会阻塞浏览器解析...

    Unity3D多个异步加载场景资源 简洁漂亮的加载画面

    在Unity3D游戏开发中,异步加载(Asynchronous Loading)是提高用户体验的关键技术之一,尤其是在处理大型场景或大量资源时。本项目提供了一个简洁且漂亮的加载画面,旨在帮助Unity3D学者理解和实现游戏资源的高效...

    jquery 异步加载页面

    **jQuery 异步加载页面详解** 在Web开发中,异步加载页面是一种常见的优化技术,它允许我们在不刷新整个页面的情况下动态地加载新的内容。jQuery,一个强大的JavaScript库,提供了丰富的API来实现这一功能,使得...

Global site tag (gtag.js) - Google Analytics