6-Ai辅助开发点赞系统笔记-TIDB&压力测试

代码地址

Github地址:https://github.com/bbhhe/thumbs-backend.git

章节内容

  • 引入分布式数据库
  • 使用Jmeter进行压力测试

开发内容

引入分布式数据库

1. 部署TiDB集群

1.1 我使用本地安装一个vmware虚拟机,然后启动一个ubuntu系统,然后安装TiDB集群。

1.png

1.2 系统启动好了,下载安装脚本

bash
复制代码
curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh

1.3 下载完之后启动

bash
复制代码
tiup playground --tag thumb --host 0.0.0.0

默认账户:root 无密码

2.png

2. 修改appliaction-dev.yml配置文件

改成TIDB数据库

yaml
复制代码
# 数据库配置 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:4000/thumbsdb username: root password: data: # Redis 配置 redis: database: 0 host: 127.0.0.1 port: 6379 timeout: 5000 password: bbhhe1 pulsar: client: service-url: pulsar://localhost:8089

启动测试

同步数据库,我重新执行创建脚本造的数据

启动项目,然后访问接口,测试点赞:

3.png

使用Jmeter进行压力测试

1. 安装Jmeter

直接在官网下载 Apache JMeter,地址:https://jmeter.apache.org/download_jmeter.cgi

启动完配置个点赞http请求

4.png

请求成功,安装成功

2. 开始测试1 - 基础实现

2.1 切换基础实现版本

5.png

2.2 开始测试

经过测试,我得电脑配置设置下面的参数:

线程数: 505个/组 启动时长:5s 循环次数: 10组

测试几次后,发现thumb表的数据不对,5000个用点赞应该有5000个,实际上只有1千多。 增加响应断言:

6.png

再次请求后发现点赞接口大部分返回的都是false

7.png

排查之后发现是代码问题:

java
复制代码
private final ReentrantLock lock = new ReentrantLock(); @Override public boolean doThumb(Long blogId, Long userId) { if (!lock.tryLock()) { log.info("尝试获取锁失败"); return false; } try { return transactionTemplate.execute(status -> { // 1. 判断是否已点赞 LambdaQueryWrapper<Thumb> queryWrapper = new LambdaQueryWrapper<Thumb>() .eq(Thumb::getBlogId, blogId) .eq(Thumb::getUserId, userId); long count = this.count(queryWrapper); if (count > 0) { return false; } // 2. 更新博客点赞数 Blog blog = blogMapper.selectById(blogId); if (blog == null) { log.info("博客ID不存在"); return false; } blog.setThumbCount(blog.getThumbCount() + 1); blogMapper.updateById(blog); // 3. 保存点赞记录 Thumb thumb = new Thumb(); thumb.setBlogId(blogId); thumb.setUserId(userId); return this.save(thumb); }); } finally { lock.unlock(); } }

代码中使用了ReentrantLock锁,导致每次只有一个线程可以获取锁,其他线程都会返回false。

在 ReentrantLock 中,tryLock() 方法默认是非阻塞的,即它会立即尝试获取锁,如果锁不可用,则立即返回 false,而不会等待。因此,默认情况下,tryLock() 的等待时间是 0。

java
复制代码
if (!lock.tryLock(5, TimeUnit.SECONDS)) { log.info("尝试获取锁失败"); return false; }

修改等待时间设置后,这次正常了

8.png 9.png 10.png

三次测试,接口响应平均9.1s,吞吐量平均为50个/s

3. 开始测试2 - Redis替换数据库

切换成Redis实现

11.png 12.png 13.png

内存速度果实快很多,接口平均响应0.1s,吞吐量平均为800个/s

验证数据的一致性,也没问题

14.png 15.png

4. 开始测试3 - Pular消息队列

切换成Pular消息队列实现

16.png 17.png 18.png

接口平均响应0.2s,吞吐量平均为600个/s

性能有所下降,但是消息队列的作用之一就是削峰填谷,保证系统的稳定性。

最后 祝大家五一快乐!

笔记本性能有限,只能测试到这么多了,后续有时间会继续通过调整 Tomcat 最大连接数、Redis 、MySQL 连接池、Pulsar 批量处理数等参数,测试点赞接口的最高 TPS。

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP