项目中遇到的bug

1.Redis服务器 can not get resource from pool.

 1000个线程并发还能跑,5000个线程的时候出现这种问题,查后台debug日志,发现redis 线程池不够。刚开始设置的是:

# redis 配置文件
#redis
redis.host=127.0.0.1
redis.port=6379
redis.timeout=300        等待时间  10s改为300s
redis.password=123456
redis.poolMaxTotal=1000   连接数,刚开始最大连接数 设置为100.
redis.poolMaxIdle=500      最大空闲连接数  100改成500
redis.poolMaxWait=300      

顺便也改了一下jdbc 的连接池参数,最大空闲和最大连接数都改成1000.在测一下。可以

spring.datasource.filters=stat
spring.datasource.maxActive=1000
spring.datasource.initialSize=100
spring.datasource.maxWait=60000
spring.datasource.minIdle=500
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=select 'x'
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=true
spring.datasource.maxOpenPreparedStatements=20

2.5000并发下的问题,20个商品,库存减到-4980。

后来看代码发现,判断库存用的是if(stock==0 ) 抛出异常。应该用stock<0,因为 若此时同时2个线程进来,就永远小于0,后面的业务逻辑都可以执行。

3.然后就是超卖的问题

第一次压力测试的时候,5000个线程,分别取不同的token(sessionId),同时访问 秒杀这个接口,商品个数只放了20个。结果出现最后商品数量变负的问题。

4.编码的问题

接口限流防刷的时候,通过计数器限流,如果超过某个阈值,向前端返回一个codeMsg对象用于显示的时候,显示的是String是乱码的问题,之前由于一直返回都是json 格式,都是封装好在data里。

这次返回是直接通过输出流直接写到response直接返回字节数组的,而不是spring controller 返回数据(springboot 默认utf-8),出现乱码问题,用utf-8编码,解决。

猜你喜欢

转载自blog.csdn.net/weixin_38035852/article/details/81388449