服务熔断、服务降级相关知识

讲讲什么是缓存预热?穿透?击穿?雪崩?如何解决

https://www.bilibili.com/video/BV13R4y1v7sP/?p=123&vd_source=09d6df3c02085a7ba697583326012939

缓存预热:缓存预热指的是系统上线或者达到高峰期之前,提前将相关的缓存数据加载到缓存系统中,以免在用户请求时先查询数据库,然后再将数据缓存问题,用户可以直接查询预先被预热缓存的数据。

常见的缓存预热方法有:

  • 手动操作。在系统上线时,通过手工操作缓存刷新页面来加载数据。
  • 自动加载。通过中间件或者程序自定完成。现在项目启动时,通过定时任务或脚本自动进行数据加载,特别适合数据量不大的情况;设置定时任务,定期刷新缓存数据,适用于数据量较大的情况。

缓存雪崩:Redis中缓存的数据大面积同时失效,或者Redis宕机,从而会导致大量请求直接到数据库,压垮数据库。

缓存雪崩(偏软件的解决方案):

  • redis中key设置永不过期或过期时间错开
  • redis缓存集群实现高可用
    • 主从数据库+ 哨兵方案
    • Redis Cluster (Redis 集群)
    • 开启Redis持久化aof/rdb,尽快恢复缓存集群
  • 多缓存结合,预防雪崩
    • ehcache本地缓存 + redis缓存
  • 服务降级
  • 人民币玩家(阿里云-云数据库Redis版)

缓存穿透:缓存和数据库中都没有数据,可用户还是源源不断的发起请求,导致每次请求都会到达数据库,从而压垮数据库。

缓存穿透解决方案:

  • 业务成校验:对于用户发过来的请求,根据请求参数进行校验,对于明细错误的参数,可以直接返回错误请求。
  • 不存在业务设置短时间校验:对于某个查询为空的数据,可以将这个结果进行Redis缓存,但是设置很短的过期时间(例如30s)。
  • 布隆过滤器:布隆过滤器是一种数据结构,利用极小的内存,可以判断大量的数据“一定不存在”或者可能存在“。对于缓存击穿,我们可以将查询到结果都哈希到一个足够大的布隆过滤器中,用户发送的请求会先被布隆过滤器拦截,一定不存在的数据就直接拦截返回了,从而避免下一步对数据库的压力。

缓存击穿:Redis中的一个热点key在失效的同时,大量的请求过来,从而全部到达数据库,压垮数据库。

缓存击穿解决方案:若其他线程也在请求key时,发现获取锁失败,则睡眠一段时间(比如100s)后重试。

  • 设置热点数据永不过期。(这种方式比较粗暴,对某些业务不适合)
  • 定时更新。例如设置热点数据过期时间是1h,那么没59minutes时,通过定时任务去更新这个热点key,并重新设置过期时间。
  • 互斥锁。这也是解决缓存穿透比较常见的方法。互斥锁见到来说就是Redis中根据key获得的value值为空时,先锁上,然后从数据库加载,加载完毕,释放锁。

服务雪崩

扇出:多个微服务之间调用的时候,假设微服务A调用微服务B和C,微服务B和C又调用其他服务,这就是所谓的“扇出”。

雪崩效应:如果扇出的链路上某个微服务调用功能响应时间过长或不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统奔溃,这就是“雪崩效应”。

对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障。所以需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序和系统。

雪崩:通常一个模块下的某个实例失败后,这时候这个模块依然还会接收流量,这个时候这个模块依然还会接收流量,这个有问题的模块还调用了其他模块,这样就会发生级联故障,或者雪崩

复杂的分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系某些时候不可避免地失败。

服务降级

服务降级——就是服务托底方案。如果服务无法完成正常的调用流程,就会使用默认的托底方案来返回数据。

例如,在商品详情页一般都会展示商品的介绍信息,一旦商品详情页系统出现故障无法调用时,会直接获取缓存中的商品介绍信息返回给前端页面。

例如,停电了,使用蜡烛照明。

服务熔断

熔断:在分布式与微服务系统中,如果下游服务因为访问压力过大导致响应很慢或者一直调用失败时,上游服务为了保证系统的整体可用性,会暂时断开与下游服务的调用连接,这种方式就是熔断。(保险丝达到最大的电流后,拉闸限电,然后调用服务降级的方法,并返回友好提示)

熔断的三种状态:闭合、开启和半开。

闭合状态(保险丝闭合通电OK):服务一切正常,没有故障时,上游服务调用下游服务时,不会有任何限制。

开启状态(保险丝断开通电Error):上游服务不再调用下游服务的接口,会直接返回上游服务中预定的方法。

半熔断状态:处于开启状态时,上游服务会根据一定的规则,尝试恢复对下游服务的调用。此时,上游服务会以有限的流量来调用下游服务,同时,会监控调用的成功率。如果成功率达到预期,则进入关闭状态。如果未达到预期,会重新进入开启状态。

服务限流

服务限流:服务限流就是限制进入系统的流量,以防止进入系统的流量过大而压垮系统。其主要的作用就是保护服务节点或者集群后面的数据节点,防止瞬时流量过大使服务和数据崩溃(如前端缓存大量实效),造成不可用;还可用于平滑请求,类似秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行。

限流算法:简单的请求总量计数,一种就是简单的请求总量计数,一种就是时间窗口限流(一般为1s),如令牌桶算法和漏牌桶算法就是时间窗口的限流算法。

服务隔离

有点类似于系统的垂直拆分,就按照一定的规则将系统划分成多个服务模块,并且每个服务模块之间是互相独立的,不会存在强依赖的关系。如果某个拆分后的服务发生故障后,能够将故障产生的影响限制在某个具体的服务内,不会向其他服务扩散,自然也就不会对整体服务产生致命的影响。

互联网行业常用的服务隔离方式有:线程池隔离和信号量隔离。

服务超时

整个系统采用分布式和微服务架构后,系统被拆分成一个个小服务,就会存在服务与服务之间互相调用的现象,从而形成一个个调用链。

形成调用链关系的两个服务中,主动调用其他服务接口的服务处于调用链的上游,提供接口供其他服务调用的服务处于调用链的下游。服务超时就是在上游服务调用下游服务时,设置一个最大响应时间,如果超过这个最大响应时间下游服务还未返回结果,则断开上游服务与下游服务之间的请求连接,释放资源。

posted @ 2025-01-10 08:14  陆陆无为而治者  阅读(49)  评论(0)    收藏  举报