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