首先,我们需要明确一下这几个名词出现的场景:分布式高并发
环境。如果你的产品卖相不好,没人鸟它,那它就用不着这几个属性。不需要任何加成,低并发系统就能工作的很好。
分布式系统是一个整体,调用关系错综复杂,其中某个资源异常,大概率会造成级联故障。当系统处于超负荷的压力之下,容器或者宿主机,将表现的异乎寻常的脆弱。load飙升、拒绝相应,甚至于雪崩,造成的后果都比较严重。
鉴于分布式系统病娇娘样式的反应,我们有各种手段来处理这些异常状况。接下来,我们将简要介绍一下这些场景,还有常用的手段。
1. 限流
“我的贴子被限流了!” 即使不是互联网从业人员,也能言之凿凿的说出这样的话。当他这么说的时候,他并不是在说高并发中的限流,它只是逻辑意义上的。
web开发中,tomcat默认是200个线程池,当更多的请求到来,没有新的线程能够去处理这个请求,那这个请求将会一直等待在浏览器方。表现的形式是,浏览器一直在转圈(还没超过acceptCount),即使你请求的是一个简单的Hello world。
你可以把这个过程,也看作是限流。它在本质上,是设置一个资源数量上限,超出这个上限的请求,将被缓冲,或者直接失败。
对于高并发场景下的限流来说,它有特殊的含义:它主要是用来保护底层资源的。如果你想要调用某些服务,你需要首先获取调用它的许可。限流一般由服务提供方来提供,对调用方能够做事的能力进行限制。
比如,某个服务为A、B、C都提供了服务,但根据提前申请的流量预估,限制A服务的请求为1000/秒、B服务2000/秒,C服务1w/秒。在同一时刻,某些客户端可能会出现被拒绝的请求,而某些客户端能够正常运行,限流被看作是服务端的自我保护能力。
常见的限流算法有:计数器、漏桶、令牌桶等。但计数器算法无法实现平滑的限流,在实际应用中使用较少。
2. 熔断
通常来说,皇帝在微服务里想夜生活过得舒服,能够大刀阔斧单刀直入,不因私事丢江山,就不得不靠熔断大总管
。熔断的作用,主要是为了避免服务的雪崩
。
如图,A→B→C互相依次调用,但C项目很可能出现问题(流量过大或者报错等),就会引发线程一直进行等待,导致拖垮整个链路层,线程资源耗尽。
意如其名,熔断就像是保险丝,超过负载了保险丝就烧掉了。当然,当后端服务缓和的时候,我们还可以再把它接上。熔断功能一般由调用端提供,用在不太重要的旁路请求上,避免这些不重要的服务因为异常或者超时,影响正常的、重要的业务逻辑
在实现上,我们可以把熔断看作是一种代理模式。当熔断打开的时候,服务将暂停对其保护资源的访问,并返回固定的或者不产生远程调用的默认结果。
3. 降级
降级是一个比较模糊的说法。限流、熔断,在一定程度上,也可以看作是降级的一种。但通常所说的降级,切入的层次更加高级一