Category: Distributed Solution
高并发下怎么防止数据重复? 多线程并发消费如果在极短的时间内,连续发送重复的消息,就会被不同的线程消费。即使在代码中有这样的判断:
|
Product oldProduct = query(hashCode); if(oldProduct == null) { productMapper.insert(product); } |
在插入数据之前,先判断该数据是否已经存在,只有不存在才会插入。但由于在并发情况下,不同的线程都判断商品数据不存在,于是同时进行了插入操作,所以就产生了重复数据。 方案: 基础系统将消息改成单线程顺序消费 唯一索引(不适用软删除) 分布式锁 insert on duplicate key update insert … ignore 加一张防重表(适用软删除)
美团(Leaf)分布式ID生成器 ULID – 一种比UUID更好的方案 为什么MySQL不推荐使用uuid或者雪花id作为主键? 时间占用量总体可以打出的效率排名为:auto_key>random_key>uuid 那么使用自增的id就完全没有坏处了吗?并不是,自增id也会存在以下几点问题: ①别人一旦爬取你的数据库,就可以根据数据库的自增id获取到你的业务增长信息,很容易分析出你的经营情况 ②对于高并发的负载,innodb在按主键进行插入的时候会造成明显的锁争用,主键的上界会成为争抢的热点,因为所有的插入都发生在这里,并发插入会导致间隙锁竞争 ③Auto_Increment锁机制会造成自增锁的抢夺,有一定的性能损失 我在项目里用雪花算法搞了唯一ID生成,结果上线就引发了故障 我们猜测是不是服务器上的时钟不同步后,又自动进行同步了,前后时间不一致。
如果accessToken放Client端,refreshToken存储在服务器,那么会违背微服务的无状态构架初衷。 accessToken和refreshToken统一放在Client端,可以遵循微服务无状态构架。 两种情况都可以通过accessToken来延长refreshToken,做到长时间保持登录状态的需求。
为了做到微服务的高可用,鬼知道我出了多少张牌 你管这破玩意儿叫高可用? (更详细构架)
1. 一、背景 我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果。 例如1. 前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果;2. 我们发起一笔付款请求,应该只扣用户账户一次钱,当遇到网络重发或系统bug重发,也应该只扣一次钱;3. 发送消息,也应该只发一次,同样的短信发给用户,用户会哭的;4. 创建业务订单,一次业务请求只能创建一个,创建多个就会出大问题等等很多重要的情况都需要幂等的特性来支持。
Spring Boot 2实现分布式锁 早期,分布式锁的相关代码存在于Spring Cloud的子项目Spring Cloud Cluster中,后来被迁到Spring Integration中。 Spring Boot加一个注解,轻松实现 Redis 分布式锁
这是我读过写得最好的【秒杀系统架构】分析与实战! 1分钟抢购10w个口罩,瞬时高并发抢购系统怎么设计? RateLimiter 源码分析(Guava 和 Sentinel 实现) 高性能开发十大必须掌握的核心技术 微博这样设计高并发系统就稳了
为解决布隆过滤器不能删除元素的问题,布谷鸟过滤器横空出世。 论文《Cuckoo Filter:Better Than Bloom》作者将布谷鸟过滤器和布隆过滤器进行了深入的对比。 相比布谷鸟过滤器而言,布隆过滤器有以下不足: 查询性能弱 空间利用效率低 不支持反向操作(删除) 不支持计数。
首先,之所以谈这个话题呢,是发现现在很多人对微服务的设计缺乏认识,所以写一篇扫盲文。当然,考虑到目前大多微服务的文章都是口水文,烟哥争取将实现方式讲透,点清楚,让大家有所收获! OK,我要先说明一下,我有很长一段时间将服务降级和服务熔断混在一起,认为是一回事!