重构大型业务型写接口 :并行处理注意点
(点击上方公众号,可快速关注)
来源:Sam哥哥 ,
blog.csdn.net/linsongbin1/article/details/72861946
概述
为了提高接口的处理速度,通常会使用并行的方式。在JAVA中可以使用ThreadPoolExecutor 或者ForkJoinPool 。像并行查询或者并行调用外部接口,经常会用到这两种技术,基本上没什么坑。但是如果是使用这两种技术来重构大型的业务型写接口,则需要小心细致。
task切分
task粒度切分是个技术活。必须大小合适。尽量保证执行task的每个线程各自拥有自己的数据,各干各的。没什么共享的资源需要访问或者更新,不然可能产生对共享资源的竞争,影响到接口的响应速度。
task里面避免慢查询
如果task里面有慢查询SQL,线程虽然获取到了DB连接,但是影响到了线程的处理速度。尤其是并发线程比较多的情况下。
配置多一些DB连接
大型的写接口,需要频繁的操作DB,加上多线程并行处理,对DB的压力也就更大。DB连接是共享资源,如果数量太少,会造成线程获取不到DB连接,导致线程处理数据的时间拉长了。
收集数据,使用并发集合容器类
不支持并发的JAVA集合容器,在并发情况下会抛异常。如果想在各个task中统计一些数据,需要使用ConcurrentHashMap等容器。
无需保证数据一致性的,别用事务。必须使用,用短事务
事务需要DB支持,会带来一些开销。能不用尽量不用。如果一定要用事务,尽量使用短的事务。长事务会导致线程持有DB连接的时间太长了。导致其他线程无法获取到DB连接。
外部系统是否支持并发调用
如果你自己应用的接口使用了并行技术,并且在接口中调用了外部接口,一定要注意外部系统的接口是否能够支持的住并发调用。如果不行,应该要调整线程并发数或者让对方系统加服务器。
借助jvisualvm工具分析线程执行时间
使用多线程并行处理的时候,一点要观察这些线程在CPU的执行时间是否比较平均。如果部分线程在CPU里执行时间长,部分短,那么可能是部分线程在某些地方被阻塞住了。可以利用JAVA自带的jvisualvm来分析。
RejectedExecutionException处理
使用了ThreadPoolExecutor后,会有一个队列存储task。当队列满了后,会抛出RejectedExecutionException 异常。对于业务型接口,可以抛出一个类似”队列已满,请稍后再试”这样的提示,以便让业务人员放慢操作或者不要继续操作,产生过多的流量。
看完本文有收获?请转发分享给更多人
关注「ImportNew」,看技术干货
- 这10种大型盆栽,保家旺财,霸气侧漏!
- 【明光最大型恐龙展·免费观看】这个春节,金港邀您带孩子重返侏
- 东莞长安地王中心大型花园小产权房双层地下停车场商品房品质
- 春节不打烊,徐闻大型嘻哈乐乐园,免费玩啦!还能免费抽大奖!
- 半数英国大型企业都持有加密货币
- 贵州这两座城市将要腾飞, 已被国家确定为大型高铁枢纽中心城!
- 【高清】大型专题片《北部湾》,内含大商机!
- 抢抢抢!哈尔滨大型冰雕展来濮阳啦!春节门票这么便宜!
- 这家大型房企,开始慢慢退出楼市,预示着房价崩盘,即将来临?
- 海上巨无霸油轮首次回国 揭开30.8万吨级超大型油轮的神秘面纱 远