重构大型业务型写接口-并行处理注意点

栏目: Java · 发布时间: 6年前

内容简介:重构大型业务型写接口-并行处理注意点

概述

为了提高接口的处理速度,通常会使用并行的方式。在 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 异常。对于业务型接口,可以抛出一个类似”队列已满,请稍后再试”这样的提示,以便让业务人员放慢操作或者不要继续操作,产生过多的流量。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算理论导引

计算理论导引

[美]Michael Sipser / 唐常杰、陈鹏、向勇、刘齐宏 / 机械工业出版社 / 2006-7 / 36.00元

本书是计算理论领域的经典著作,被国外多所大学选用为教材。本书以注重思路、深入引导为特色,系统地介绍计算理论的三大主要内容:自动机与语言、可计算性理论和计算复杂性理论。同时,对可计算性和计算复杂性理论中的某些高级内容作了重点讲解。全书通过启发性的问题、精彩的结果和待解决问题来引导读者挑战此领域中的高层次问题。新版的一大亮点是增加了更多习题、教辅资料和部分习题解答,更加有利于教学。 全书叙述由浅......一起来看看 《计算理论导引》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

随机密码生成器
随机密码生成器

多种字符组合密码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换