1. 缓存预热
缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样避免在用户请求的时候,再去加载相关的数据。因为有些系统一旦启动就要面临上千上万的请求进来,如果直接让这些请求打到数据库上,非常大的可能是数据库压力暴增,直接无法正常响应。
为了缓解这个问题,就需要通过“预读取”来解决。
在单机系统情况下比较简单:
- 直接写个缓存刷新页面,上线时手工操作下
- 数据量不大,可以在WEB系统启动的时候加载
- 搞个定时器定时刷新缓存,或者由用户触发都行
分布式缓存系统,如Memcached,Redis,比如缓存系统比较大,由十几台甚至几十台机器组成,这样预热会复杂一些:
解决思路:
- 写个程序去跑
- 单个缓存预热框架
2. 缓存降级
当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级。
降级的最终目的是保证核心服务可用,即使是有损的。而且有些服务是无法降级的(如加入购物车、结算)。
在进行降级之前要对系统进行梳理,看看系统是不是可以丢卒保帅;从而梳理出哪些必须誓死保护,哪些可降级;比如可以参考日志级别设置预案:
- 一般:比如有些服务偶尔因为网络抖动或者服务正在上线而超时,可以自动降级;
- 警告:有些服务在一段时间内成功率有波动(如在95~100%之间),可以自动降级或人工降级,并发送告警;
- 错误:比如可用率低于90%,或者数据库连接池被打爆了,或者访问量突然猛增到系统能承受的最大阀值,此时可以根据情况自动降级或者人工降级;
- 严重错误:比如因为特殊原因数据错误了,此时需要紧急人工降级。