- 峰值QPS=(日总PV数80%)/(日总秒数20%)
- 架构拆分
1)系统维度
2)功能维度
3)读写维度
3.队列
1)流量削峰
2)分布式事务(可靠消息模式):
A.上游系统要保证消息不丢失,可以通过本地消息表和后台定时任务来实现
B.下游要保障消息不重复处理,保障幂等,可以通过判重表来实现
C.适用场景:分布式事务的提交或回滚只取决于消息发起方,无需回滚
4.缓存
A.
1)客户端缓存(浏览器、APP客户端)
2)网络(CDN)
3)接入层:Nginx本地缓存(内存有限,储存热点数据)
4) 应用层:Redis
B.缓存读写策略
1)Cache Aside:
更新数据时,不更新缓存,删除缓存中的数据;
读取数据时,若缓存中没有数据,从数据库读取,更新到缓存中;
2)Read/Write Through
更新数据时,先读缓存,若缓存命中,则先写缓存,再由缓存组件同步写入数据库;若缓存未命中,则直接写入数据库;
读取数据时,若缓存中没有数据,从数据库读取,更新到缓存中;
C.缓存问题
1)缓存雪崩:大量数据同时失效导致数据库压力过大//缓存服务器宕机
解决方案:
- 使用高可用分布式缓存
- 设置缓存有效期为随机值
- 热点数据设置永不过期
- 缓存失效后,通过加锁或队列来控制读数据库的线程数据
2)缓存穿透: 缓存未命中,大量请求访问数据库
解决方案:
- 缓存空值
- 布隆过滤器:适用于大量恶意请求不存在的数据,缓存空值也无效,布隆过滤器在不查数据库时就可以判断key是否存在;
这种算法由一个二进制数组和hash算法组成,判断一个元素在一个集合中是否存在, 省空间,性能高;但有误判,不能删除
写入数据时,先更新布隆过滤器;
查询数据时,先查询布隆过滤器是否存在,若不存在,直接返回空,若存在,再去查询数据库
5.降级:暂时屏蔽,过后打开
A.
-
非核心功能降级
-
写服务降级:不更新数据库,只更新缓存,把要写的数据放到消息队列,流量高峰过后,把消息队列中的数据回放到数据库
B. -
自动降级
1)超时降级
2)限流降级
3)统计失败次数降级 -
手动降级
配置文件实现开关配置
把非核心功能关掉,开关
C .降级后的处理方案
使用默认值
兜底数据
缓存数据
错误页面…
6.限流:对稀缺资源限制请求量,限速、拒绝服务
算法:
固定时间窗口算法
滑动时间窗口算法
令牌桶:限制的是平均流入速率
漏筒:限制的是平均流出速率