1、优化方案与主要实现代码
有一个每年都举行的投票活动,原系统是很多年前开发,系统的支持的并发数不高,在投票期间经常出现崩掉的情况。
投票规则为按IP限制,每24小时投1票。
1.1、原系统的技术架构
运行在4核8G服务器上,用了PHP+MySQL+Redis开发,运行在4核8G的服务器上。
投票页面的功能很简单:
- 1、是投票页面的访问,涉及当前选项的投票结果显示;
- 2、用户点击按钮进行投票,涉及数据入库保存和投票结果刷新问题。
旧投票系统虽然都用了缓存(有缓存时间),但是在持续流量下,缓存被击穿,访问页面或点击投票,出现数据库被读写的情况,系统崩掉。
Jmeter压测性能在100并发左右 。
1.2、新系统的技术架构
使用Go(gin、sqlx、go-redis)+Redis缓存+Redis队列+MySQL
实现逻辑图如下:
2、压测结果
测试结果是在4核8G的Centos7虚拟机上压测。
2.1、设置的Jmeter线程组
线程数1000,Ramp-up为1秒,循环次数1000,共产生100万条投票压测数据。
2.2、Jmeter聚合报告结果,支持11240/秒吞吐量
2.3、Jmeter TPS结果,支持15000/秒最大并发
2.4、总CPU和总内存变化情况
CPU从0%上升到31.2%最大值,随后在这个范围内上下浮动。
内存也在不断上升,压入100万数据后,内存从1.7GB上升到2.3GB,随后下降。
2.5、Redis和go进程占用资源
go应用./main:CPU从0%上升到280%;内存从0.3%上升到0.8%,变化不大;
redis-server:CPU从0%上升到81.2%;内存从10.3%上升到12.9%;