简单理解微服务限流、降级、熔断

2023-09-12 08:18:00 浏览数 (1)

微服务限流、降级、熔断分别都是什么意思,我们平时工作中为什么要关注这些东西呢?

公司不断的发展壮大,一开始处于蛮荒时代,咱们从单体应用过渡到微服务的时候,可能还是那一套单体的思想,再加上用户量可能也不多,直接就不去考虑起量了之后,我们需要如何处理

可殊不知,当有一天起量了,机会摆在你面前时候,你没有准备好,你也是抓不住的

先举一个生活中常见的例子:

我们有时去访问一个网站的时候,当网络正常的情况下,我们发现访问这个网站,比平时好像慢了一些,且会出现报系统错误的情况,或者报错系统繁忙等信息,可能是服务做了超时,超时之后就报错了

再举一个双 11 的例子

咱们访问某猫或者某狗的时候,咱们发现并不是每一次访问都是可以正常进入页面的,也就是说一会可以正常进入页面,一会又不能正常进入页面,并且会提示系统繁忙请稍后再试,此处实际上是服务应用了限流和熔断

另外,在双 11 这一天,咱们买了商品之后,发现当天是没有办法进行退款的,这个是应用了服务降级

那么,咱们在技术上什么限流,什么是熔断,什么又是服务降级呢?

什么是限流?

通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理,限流是从整体系统上去进行考虑的

最近国庆了,很多人都会去坐火车,坐高铁,咱们排队过安检的时候,我们可以看到保安会隔一会放 10 个人进去,过一会又放一些人进去,一直维持着里面只能有 10个人在进行安全检查

那么这 10 个数字,就相当于是服务进行的限流,只要一达到 10 人以上的请求,那么就会服务拒绝,当有空余的时候,才会处理新来的请求,这个应该就不难理解了吧

一般限流的方式有这些:

  • 固定时间窗口控制
  • 使用漏桶的方式
  • 使用令牌桶的方式

关于限流的详细的具体实现方式,咱们可以查看历史文章:最常用的限流算法以及如何在http中间件中加入流控

什么是熔断?

熔断和限流还不太一样,上面我们可以看到限流是,控制请求速率,只要还能承受,那么都会处理,可是熔断是这样的一个效果

举个 栗子

例如咱们的微服务系统中,多个微服务是会相互调用的,且会存在一个较长的调用调用链,链路一长,关联的服务多了就会带来一个问题

网关请求到我们的微服务 A,微服务 A 需要去调用微服务 B,微服务 C,微服务 B 还会去调用为服务 D,微服务C也会去调用其它的微服务

这个时候,如果在这条链路上,哪怕有一个服务出现了问题,或者相应时间过长,那么对与微服务A的调用就会占用越来越多的系统资源,一般服务也是会做重试机制,且当客户端调用某个接口不能得到正常响应的时候,是会进行疯狂请求的,这会导致微服务 A 消耗过多资源,进而引起系统崩溃,所谓的“雪崩效应”

那么这个时候,就不得不引入一个断路器来进行熔断,咱们一会会应用 hystrix 来进行功能实现

关于熔断,我们可以这样来思考,咱们初高中学过的物理,家里的电闸开关出都会设置一个保险丝,当咱们的用电负荷过大的时候,保险丝就会自我熔断,保护电路

那么微服务中的熔断也是这个效果,他可以保护咱们的调用链路,防止高压请求带来资源极高的消耗,最终导致雪崩,熔断是从微服务层级去考虑的

咱们的断路器 hystrix 当发现链路中,微服务 A 请求 微服务 B ,响应时间过长,或者 微服务 B 不可用的时候,那么微服务 A 就会迅速的进行错误响应,而不是疯狂的去调用微服务 B

Hystrix 自身还有探测机制,会去探测微服务 B 是否可用,如果可用了,那么微服务 A 的请求就会正常的去请求微服务 B

关于断路器的使用方式,实现方式,和熔断的实现方案,我们可以查看历史文章:golang 微服务中的断路器 hystrix

什么是服务降级?

当我的微服务架构整体的负载超出了预设的上限阈值或要应对即将到来的大流量是,为了保证重要或基本的服务能正常运行,会自动或者手动的关闭某些外围或者不重要的服务

服务降级其实就更好理解了,例如咱们服务有 10 个功能,当服务压力过大的时候,咱们就可以自动关闭外围的几个核心的功能,让系统资源都集中咱们的核心服务上,一般是从外围服务开始降级

咱们做核酸已经持续好几年了,咱们以喉咙上的老茧为证

做核酸的时候,进入一个通道,我们可以看到,最开始有检查戴口罩的,往下走,有检查健康码的,再往下走,开始检查场所码,最后快到大白处之后,就开始检查核酸码了

当有大的人流量,咱们做核酸的时候,可能就只有查看场所码和核酸码了,这个就好理解了吧

0 人点赞