[汇总]高并发,构架&项目经验
多线程并发消费如果在极短的时间内,连续发送重复的消息,就会被不同的线程消费。即使在代码中有这样的判断:
1 2 3 4 |
Product oldProduct = query(hashCode); if(oldProduct == null) { productMapper.insert(product); } |
在插入数据之前,先判断该数据是否已经存在,只有不存在才会插入。但由于在并发情况下,不同的线程都判断商品数据不存在,于是同时进行了插入操作,所以就产生了
重复数据
。
方案:
- 基础系统将消息改成
单线程顺序消费
- 唯一索引(不适用软删除)
- 分布式锁
- insert on duplicate key update
- insert … ignore
- 加一张
防重表(适用软删除)