由于后端服务创建issue采用的是synchronized同步方法(防止出现相同的issue编号,最大的编码会存在projectInfo中),由于service是单例的导致并行创建issue时需要等待同步,从而出现创建issue缓慢的问题,这里采用原子类AtomicLong来控制并发,提升并行时的创建速度
构建工具类,采用AtomicLong控制并发
1  | public class IssueNumUtil {  | 
更新projectInfo的issueMaxNum值
1  | /**  | 
1  | <update id="updateIssueMaxNum">  | 
下载与安装JMeter
由于Postman只能测api的并发(按顺序调用api),而我们需要的是并行(同时调api)来测试我们的工具类,因此采用压力测试工具JMeter
- 到官网下载最新版本的JMeter
 

- 解压压缩包
 
1  | tar -xzvf apache-jmeter-5.1.1.tgz  | 
- 进入bin目录,更改语言为中文
 
1  | cd apache-jmeter-5.1.1/bin  | 

- 进入bin目录,启动JMeter
 
1  | sh jmeter  | 

用JMeter进行并行测试
- 设置线程组
 

- 设置HTTP请求
 


- 设置HTTP请求头
 


- 设置同步定时器来实现并行
 

10个线程等待1s并行

- 观察结果树
 


- 运行结果
 

结论
最后证明可以用原子类可以替代基于全局单例的synchronized,使用AtomicLong在不同项目间控制并行,以此来提升createIssue的并行速度
结合RedisAtomicLong
在微服务环境下多pod的情况中,AtomicLong缓存在一个服务中,则会出现issueNum重复的情况,因此要采用外部缓存,这里采用的是RedisAtomicLong
1  | public class IssueNumUtil {  | 
延伸:并行与并发
并发:并发的关键是你有处理多个任务的能力,不一定要同时
并行:并行的关键是你有同时处理多个任务的能力