由于后端服务创建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 { |
延伸:并行与并发
并发:并发的关键是你有处理多个任务的能力,不一定要同时
并行:并行的关键是你有同时处理多个任务的能力