大家都如何进行压力测试和解决高并发下数据重复问题呢?
发布于 6 年前 作者 ddzyan 4370 次浏览 来自 问答

1.大家现在都是用什么工具进行接口的高并发测试呢?我现在了解到的有jmeter和locust,有使用的朋友介绍下吗

2.接口现在实现的功能是去是数据库读取一个值进行操作后在进行数据库更新,保障每次数据不重复。但是在高并发的情况下,出现了数据还未更新,下个请求就读取进行操作,造成重复的情况。 我现在的解决方法是加个锁,如果数据未被更新则不接受接下来的请求,但是这样会造成多个请求失败的情况。是否可以进行消息队列的操作,要如何实现呢?

15 回复

出现2这种情况,最好用update更新数据,不要findOne出来之后save

@zhangshiqiu 如果必须存在要先获取数据,然后对数据进行操作,再进行更新的话。要怎么处理呢?

这不就是资源竞争的情况吗,多个请求更新同一个数据项,能不能从请求侧就限制请求同一条数据呢。你现在的锁是在业务层锁,要么就用db提供的事务来实现,把这些操作放在一个事务里

我也是用的锁,数据库是mongodb。有一个业务需要操作4个文档,然后我用了4把锁,想着都害怕。但是实在找不到其他更好的办法了

来自酷炫的 CNodeMD

select…for update了解下 或者序列化级别事务都可以

来自酷炫的 CNodeMD

@zy445566 好的,我想现在就是用表锁就上事务做的

@royalrover 我现在就把查询和更新放在了一个事务里面,并且增加了表锁。如果在限制了请求,就会造成高频率下的请求失败几率。

@ddzyan 你用mongodb 4.0吗

来自酷炫的 CNodeMD

@royalrover 事务可以解决这种问题吗? 我理解的事务是保证一系列操作是原子的。

参考关键词 秒杀 可以使用redis的watch

@ddzyan 应该不会有这样的才对,一般都可以转换为对应的数据操作原子进行,如果有可以通过重新设计数据库来优化,否则一定会造成大量业务错误。

@zhangshiqiu 为什么,我是小白,请大神指点

@royalrover 虽然是竟态问题,数据库事物在某隔离级别下是存在幻读的。

来自酷炫的 CNodeMD

感觉消息队列可以做,数据库压力小 没用过,可以看看rabbitmq文档

来自酷炫的 CNodeMD

@weierbufan 出现幻读的话不可避免,要么更改隔离级别,要么使用中间件,如mq

回到顶部