微服务架构 | 缓存 - [常见坑]

INDEX

      • §1 常见坑总览
      • §2 缓存穿透
      • §3 缓存击穿
      • §4 缓存雪崩

§1 常见坑总览

  • 穿透
    强调 缓存层不完全生效,即上了缓存和没上一样
    因此 缓存命中率降低 是重点
  • 击穿
    强调 众多并发的请求在 key 空间上的分布不均匀,通常是热点数据的失效
    因此 数据库压力骤增,但缓存运行正常 是重点
  • 雪崩
    强调 效果与效果的连锁性
    因此 仅仅重启不能解决问题 是重点

§2 缓存穿透

成因
缓存命中率降低
- 可能是业务重心变更导致的
出现大量对不存在数据的查询
- 恶意攻击
- 数据到达延时
上游系统将数据推至 服务1,服务1 推至当前服务后才能查询
但查询请求来早了,数据还没有到达当前服务

现象

  • 缓存命中率降低
  • 应用服务器压力突然变大
  • 数据库等其他持久化层压力突然并持续增加

解决方案

  • 空白缓存
    但过期时间设置较短,否则正常数据的刷新可能不及时
    比如 数据到达延时 情况下,太长额过期时间会影响系统效率
    注意不要引发击穿
  • 白名单
    • 可以使用 bitmaps 实现,通过 id 计算偏移量
      不在白名单中的请求不允许访问
      但不适合陌生访问很多的场景,比如互联网项目
  • BoolmFilter
    类似 bitmaps 白名单,时间空间效率极高
    但有一定的误判率(判断不存在的一定不存在,反之不确定),同时删除难度较高
  • 实时监控
    发现命中率急速降低时,研发与运维人员配合排查访问对象和数据库
    可以通过设置黑名单限制用户行为

§3 缓存击穿

成因

  • 某个或某些热点数据过期
    一般是少量几个热点 key 甚至一个 key 导致的,很多教程或视频也强调是 “一个热点数据失效”
    但若有有限一组 key 承接了当前环境极重比例的请求,这些 key 集体失效也是击穿
    击穿的本质是 众多并发的请求在 key 空间上的分布不均匀,承接高并发访问的就是热点数据
    进而少量 key 的失效却造成了极高的并发访问量透过了缓存

现象

  • 数据库等其他持久化层压力瞬间增加
  • 不一定出现大量 key 过期(通常只是少量)
  • 缓存还在正常运行

解决方案

  • 预设热点缓存
    在服务刚启动时效果十分显著
  • 实时续期过期时间
  • 使用锁
    对 key 失效后重新拉取数据进入缓存的操作加锁,以避免超过并发到达数据库

§4 缓存雪崩

成因

  • 短时间内,大量 key 过期
  • 注册中心或服务不同时启动造成
    缓存服务启动后,将自己注册到注册中心
    但刚刚注册一个节点,其他服务就发现了,并集中访问导致缓存节点崩溃
    后续启动并注册的缓存节点同理

现象

  • 数据库压力持续变大至崩溃
  • 服务器压力持续变大至崩溃

解决方案

  • 多级缓存
    同时存在多种缓冲或持久层,比如 nginx + redis + es
  • 队列或锁
    本质上是直接对用户访问进行限流
    有效但可能对用法访问的吞吐量造成损耗
  • 动态刷新即将过期 key
    需要其他线程扫描 key,对即将过期的重新拉取
  • 小范围随机波动的过期时间
    在过期时间的基础上增加随机值,防止大面积 key 同时过期

你可能感兴趣的:(中间件,缓存,架构,微服务)