概述
为了提高接口的处理惩罚速度,凡是会利用并行的方法。在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 异常。对付业务型接口,可以抛出一个雷同”行列已满,请稍后再试”这样的提示,以便让业务人员放慢操纵可能不要继承操纵,昆山软件开发,发生过多的流量。