- 浏览: 1582972 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
jsrgzhangzhiyong:
关于null值的转换还是感觉不太友好,就像 mapstruct ...
我也造了个轮子:BeanMapping(属性拷贝) -
he037:
a417930422 写道引用使用EPHEMERAL会引出一个 ...
基于zookeeper的分布式lock实现 -
seancheer:
qianshangding 写道首先节点启动后,尝试读取本地的 ...
zookeeper学习记录三(session,watcher,persit机制) -
雪夜归人:
您好,我想咨询一下,开源的canal都能支持mysql的哪些版 ...
Canal BinlogChange(mysql5.6) -
zhoudengyun:
copy 一份做记录,后续学习,请知悉
阿里巴巴开源项目: 基于mysql数据库binlog的增量订阅&消费
背景
最近着手在一个已有的应用中实施并行加载技术,整理记录一下过程中遇到的问题,方便以后查阅。
关于并行加载可以访问: (业务层)异步并行加载技术分析和设计
姊妹篇: (业务层)异步并行加载ChangeLog
问题集
1. ThreadLocal不支持
原理分析: 因为并行加载,导致原先的代码快使用了新的独立的线程进行加载。导致原先代码中使用了ThreadLocal失效。
应用分析: 使用的ThreadLocal有几处地方
* request/response。 需要在biz层直接操作Http请求对象,web/biz层需要隔离,所以将其包装到ThreadLocal中。
* cache机制。 应用中为了解决权限控制,会一次性通过rpc调用获取remote的权限数据。然后放在ThreadLocal中,web/biz,模板上直接获取ThreadLocal的数据。
* 重复请求对象。 应用中是一个模块化的设计,为了减少耦合性。两模块直接不允许传递直接数据,但一些会员对象基本每个模块都需要依赖,所以需要进行控制,避免出现重复加载。
解决与否: 已解决,Change 2中已实现
2. annotation数据丢失
原理分析:因为并行加载,采用了cglib生成了代理对象,新的class类。
应用分析:一般使用annotation存在几处地方。
* 参数绑定功能。 现在的MVC框架,包括公司自己的web框架,都喜欢使用在web层进行参数绑定,通过定义一个method参数级的annotation,给定具体的name,框架进行自动注入属性。
* spring的一些annotation,比如autowire,transtional等。
解决与否: 并不直接正面解决annotaion丢失,而是提供util类允许获取原始的代理对象,从中提取到annotaion信息。
备注: 测试过程中,不仅仅annotation数据丢失,generic泛型信息,field属性都存在丢失。所以针对class对象的一些操作,都是建议直接操作原始class。
3. 两次cglib代理,出现final类无法生成代理类
原理分析:因为并行加载,出于性能考虑采用了cglib字节码增强技术。还有一点,jdk代理是依赖必须有接口类,所以综合考虑选择了cglib代理。
应用分析: final对象存在的几处地方
* 原先的一些rpc调用,已经通过spring生成了一次代理,部分是使用jdk或者cglib。 通过设置proxyTargetClass=true/false属性。
* 部分class类,被强制声明为final,避免子类继承
* 原先应用中部署了一些profile信息,通过拦截器记录一些调用次数和时间等,也是使用了cglib。
解决与否: 没办法正面解决,无解的问题。 只能是通过注意使用层面进行规避。
建议的使用:
* 使用基于spring advise的并行加载机制,而不是代理整个service。 说白了,就是在原先的代理基础上,新增一个并行加载的拦截器。
* 使用基于template+callback模板模式的并行加载机制,实现AsyncLoadCallback,传递一代码块。在这代码块中,你可以委托你的service(可能是被cglib代理过的)进行调用。比较嵌入业务
4. 缺少默认的构造函数,无法通过newInstance()实例化对象
原理分析:当前一些反射机制
应用分析:
* 没有默认的构造函数,新增了自定义的构造函数,特别是在一些model对象。
解决与否: 因为如果构造函数中对传递的参数有依赖时,比如进行一些业务判断。目前只是尽可能的去尝试解决,针对带参数的构造函数,尝试给出一些默认值。
5. 空指针判断( == )
原理分析: 为实现异步并行加载机制,在调用时会立马返回一个假的返回对象。也就是这个返回对象永远不会为null
应用分析:
* 应用中存在比较大量的,在进行一次service调用后,会针对其返回结果进行一次==null判断,避免所谓的NPE。
解决与否: 没法从根本上解决该问题,只能是规范和明确并行加载机制的适用范围。建议是:service在model对象默认不为空。
备注:
* 提供了AsyncLoadUtils.isNull() 替换原先的==null判断方法。有一定的侵入性。
* 使用AsyncLoadTempalte机制,自定义一个新的并行加载单元,将==null判断包在一个新的AsyncLoadCallback中
6. 返回对象为Object,运行过程进行类型强制转化
原理分析: 异步加载,需要在调用时立马返回一个假的对象,会根据当前method的返回值生成代理对象。
应用分析:
* 在应用接口中,为了实现所谓的扩展,会以很泛化的Object对象进行结果对象传递。然后通过instanceof在运行时进行强制转化
解决与否: 已解决,在扫描到返回对象如果为Object,进行直接调用。 另外:可以通过AsyncLoadTempalte机制,强制指定目标的真实返回对象
=========================================2010-04-08更新
7. 并发加载产生的问题:
异常信息1:
Caused by: java.lang.NullPointerException at sun.reflect.GeneratedMethodAccessor208.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.alibaba.china.searchengine.dal.dao.search.GeneralSearchImpl$1.intercept(GeneralSearchImpl.java:322) at com.alibaba.china.searchengine.dal.dao.dto.OfferSearchResult$$EnhancerByCGLIB$$5dc08842.getComplexResult(<generated>) at com.alibaba.kylin.biz.esite.bo.dataprovider.offer.AbstractOfferDataFeeder.searchRecommendOffers(AbstractOfferDataFeeder.java:251) at com.alibaba.kylin.biz.esite.bo.dataprovider.winport.AbstractGlareRecOfferDataProvider.getData(AbstractGlareRecOfferDataProvider.java:117) at com.alibaba.kylin.biz.esite.bo.dataprovider.winport.GlareRecOffer2DataProvider$$FastClassByCGLIB$$21ffc53c.invoke(<generated>) at net.sf.cglib.reflect.FastMethod.invoke(FastMethod.java:53) at com.alibaba.kylin.biz.common.dataresolver.FunctionObject.apply(FunctionObject.java:89) ... 58 more
异常信息2:
Caused by: java.util.ConcurrentModificationException at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372) at java.util.AbstractList$Itr.next(AbstractList.java:343) at com.alibaba.china.searchengine.dal.dao.search.GeneralSearchImpl$1.intercept(GeneralSearchImpl.java:298) at com.alibaba.china.searchengine.dal.dao.dto.OfferSearchResult$$EnhancerByCGLIB$$5dc08842.getComplexResult(<generated>) at com.alibaba.kylin.biz.esite.bo.dataprovider.offer.AbstractOfferDataFeeder.searchRecommendOffers(AbstractOfferDataFeeder.java:251) at com.alibaba.kylin.biz.esite.bo.dataprovider.winport.AbstractGlareRecOfferDataProvider.getData(AbstractGlareRecOfferDataProvider.java:117) at com.alibaba.kylin.biz.esite.bo.dataprovider.winport.GlareRecOffer2DataProvider$$FastClassByCGLIB$$21ffc53c.invoke(<generated>) at net.sf.cglib.reflect.FastMethod.invoke(FastMethod.java:53) at com.alibaba.kylin.biz.common.dataresolver.FunctionObject.apply(FunctionObject.java:89) ... 58 more
异常信息3:
Caused by: java.lang.IllegalStateException: Current state = RESET, new state = FLUSHED at java.nio.charset.CharsetDecoder.throwIllegalStateException(CharsetDecoder.java:951) at java.nio.charset.CharsetDecoder.flush(CharsetDecoder.java:640) at java.lang.StringCoding$StringDecoder.decode(StringCoding.java:143) at java.lang.StringCoding.decode(StringCoding.java:173) at java.lang.StringCoding.decode(StringCoding.java:185) at java.lang.String.<init>(String.java:570) at java.io.ByteArrayOutputStream.toString(ByteArrayOutputStream.java:163) at com.danga.MemCached.SockIOPool$SockIO.readLine(SockIOPool.java:1595) at com.danga.MemCached.MemCachedClient.loadItems(MemCachedClient.java:1470) at com.danga.MemCached.MemCachedClient.get(MemCachedClient.java:1223) at com.danga.MemCached.MemCachedClient.get(MemCachedClient.java:1152)
说明:
1. 异常信息1和2,都是因为search的设计引起的。目前search是采用了lazyTask的加载模式,会尝试合并多次查询请求,并将查询请求lazyTask放到ThreadLocal中。而使用了并行加载后,首先多个work thread都能共享这个ThreadLocal,导致多个work thread同时都在处理请求,从而导致各种各样的异常。
2. StringCoding代码中,使用了ThreadLocal decoder = new ThreadLocal()进行数据对象cache,因为并行加载进行threadLocal共享,所以导致不同线程使用了同一个decoder对象,从而出现线程安全问题。
悲剧阿,两个都是因共享ThreadLocal引出来的一个问题。
发表评论
-
yugong QuickStart
2016-03-05 01:52 0几点说明 a. 数据迁移的方案可参见设计文档,oracl ... -
阿里巴巴开源项目: 阿里巴巴去Oracle数据迁移同步工具
2016-03-05 18:29 6334背景 08年左右,阿里巴巴开始尝试MySQL的相关 ... -
愚公performance
2016-03-02 17:29 0性能测试 全量测试 场景1 (单主键, ... -
yugong AdminGuide
2016-03-02 16:40 0环境要求 操作系统 数据库 迁移方案 部署 ... -
Tddl_hint
2014-01-27 13:52 0背景 工作原理 Hint格式 direct模 ... -
tddl5分库规则
2014-01-26 14:41 0背景 工作原理 构建语法树 元数据 基于 ... -
tddl5优化器
2014-01-22 15:12 0背景 工作原理 构建语法树 元数据 抽象语 ... -
Canal BinlogChange(mariadb5/10)
2014-01-20 17:25 4439背景 先前开源了一个 ... -
asynload quickstart
2013-10-08 22:49 0几点说明: 1. asyncload是做为一个j ... -
映射规则配置
2013-09-26 11:25 0背景 因为alibaba的特殊业务,比如: 同 ... -
网友文档贡献
2013-09-18 15:50 01. Otter源代码解析系列 链接:http://e ... -
Manager配置介绍
2013-09-16 13:00 0通道配置说明 多种同步方式配置 a. 单向同步 ... -
canal&otter FAQ
2013-09-05 17:30 0常见问题 1. canal和 ... -
阿里巴巴开源项目:分布式数据库同步系统otter(解决中美异地机房)
2013-08-22 16:48 40198项目背景 阿里巴巴B2B公司,因为业务的特性 ... -
Otter AdminGuide
2013-08-19 11:06 0几点说明 otter系统自带了manager,所以简化了一 ... -
Otter高可用性
2013-08-17 23:41 0基本需求 网络不可靠,异地机房尤为明显. man ... -
Otter数据一致性
2013-08-17 23:39 0技术选型分析 需要处理一致性的业务场景: 多地修改 ( ... -
Otter扩展性
2013-08-17 22:20 0扩展性定义 按照实现不同,可分为两类: 数据处理自定 ... -
Otter双向回环控制
2013-08-17 21:37 0基本需求 支持mysql/oracle的异构数据库的双 ... -
Otter调度模型
2013-08-17 20:13 0背景 在介绍调度模型之前,首先了解一下otter系统要解 ...
相关推荐
Asyncload是一款异步并行加载工具(依赖字节码技术)。背景前段时间在做应用的性能优化时,分析了下整体请求,profile看到90%的时间更多的是一些外部服务的I/O等待,cpu利用率其实不高,在10%以 下。 单次请求的响应...
并行工程的理论及实施,并行工程的理论及实施课件,并行工程的理论及实施PPT
根据D D s 芯片AD 98 50 的工作原理, 设计了A T8 9C 51 加载AD 98 50 的... 按照AD 98 50 并行加载数据的时序要求, 画出了并行加载AD 98 50 控制字的流程图; 最后, 给出了AT8 9 C5 1 并 行加载A D 98 50 芯片的源程序。
xilinx FPGA PROM 加载设计
spark 并行加载 greenplum 数据,为正确运行,需引入 spark 相关包和 greenplum 驱动。 <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core --> <groupId>org.apache.spark ...
对并行多机调度问题的简单介绍,及相关案例
论文研究-ATO供应链中航空运输及并行机生产协调调度问题 .pdf,
这个简单的项目旨在并行加载数据(尤其是视频数据)以提高整个系统的效率。该框架如下所示: 我们派生$ K $线程来加载和解码CPU中的数据,并维护一个全局FIFO队列来存储数据。 需要一个主要任务线程在GPU中训练...
AT89C51并行加载DDS芯片AD9850的方法.pdf,汉英大家下载
本文主要介绍如何使用head.js实现网站并行加载但顺序执行JS,提高网站加载速度。需要的朋友可以看下
并行工程的实施及其关键技术研究,王兵,徐达,并行工程是解决产品开发问题的有效方法,是提高产品竞争能力的重要手段。本文介绍了并行工程的定义及其实施的基本原则,结合机械�
并行EPROM引导加载在双DSP系统中的实现
本文介绍了对约旦工业中并行工程(CE)实施情况的统计比较研究,回顾了CE的实践,然后将其划分为六个统计隐患。 开发了用于实施CE的结构方程模型(SEM),然后将该模型应用于以下约旦工业部门:化学和化妆品工业,...
矩阵特征问题不仅可以直接解决数学中诸如非线性规划、常微分方程以及其他各类 数学计算问题,而且在结构力学、工程设计、计算物理和量子力学中都发挥着重要的作 用,目前矩阵特征问题的应用大多来自于求解数学物理...
有些查询不能够从并行查询之中获益,要么受限于当前的实现,要么由于并行查询并不比串行查询规划快。然而,对于那些可以从并行查询中收益的查询而言,并行查询加速的效果是非常明显的。有些查询可以在并行查询中快两...
分布式内存数据库数据并行快速加载与索引技术.doc
2、熟悉快速排序的并行算法 3、实现快速排序的并行算法 3.2 实验环境及软件 单台或联网的多台PC机,Linux操作系统,MPI系统。 3.3实验内容 1、快速排序的基本思想 2、单处理机上快速排序算法 3、快速排序算法的...
这是Intel Parallel Studio中给出sample,用来指导如何使用这个软件进行并行计算的,我测试过了,采用并行策略时两个CPU核都会运行起来,速度显然要比平时的单核要快一倍,感觉很有用,就拿出来和大家分享一下,并行...