高并发问题
问题分类
侧重于“高并发读”的系统
例如如下场景
- 搜索引擎
- 电商的商品搜索
- 电商系统的商品描述、图片和价格
侧重于“高并发读”的系统
例如如下场景
- 广告扣费系统
同时侧重于“高并发读”和“高并发写”的系统
例如如下场景
- 电商的库存系统和秒杀系统
- 支付系统和微信红包
- IM、微博和朋友圈
高并发读
策略:加缓存
本地缓存或Memcached/Redis集中式缓存
当数据库支持不住的时候,首先想到的就是为其加一层缓存。缓存通常有两种思路:一种是本地缓存,另一种是Memcached/Redis类的集中式缓存
使用缓存时需要考虑一些问题,
- 缓存雪崩:
- 定义:大量缓存同时无法访问,会导致所有请求全部访问并压垮数据库
- 发生原因:
- 大量缓存数据同时过期
- Redis故障
- 处理方案
- 大量缓存数据同时过期:1. key的过期时间随机设置 2.请求数据库排队处理。
- Redis故障:1.redis高可用机制 2. 服务熔断或请求限流机制
- 缓存穿透
- 定义:大量访问不存在的key,会导致请求全部访问并压垮数据库
- 发生原因:访问的数据既不在数据库,也不在缓存中
- 处理方案
- 非法请求的限制
- 缓存空值或者默认值
- 布隆过滤器
- 缓存击穿:
- 定义:热点数据过期,对热点数据的访问会全部访问并压垮数据库
- 发生原因:热点数据过期
- 处理方案:
- 热点数据永不过期,或者续期
- 排队降级访问数据库,第一个降级的查询会重新更新缓存
MySQL的Master/Slave
主库负责读写,从库负责读
CDN静态文件加速(动静分离)
将图片、HTML、JS、CSS 文件等静态文件缓存到全网的各个节点,用户访问时就进读取
策略 :并发读
- 异步调用(RPC):没有耦合关系的多个接口可以并行调用
- 冗余请求:单台机器的调用延迟概率时1%,100台机器的延迟概率就是1-(99%)^100=63%,延迟的概率很高。客户端同时向多台服务器发送请求,哪个返回得快就用哪个,其他的丢弃,但这会让整个系统的调用量翻倍