sentinle常见问题FAQ
熔断、限流、降级如何理解
上图的问题就是综合服务调用外部服务,当B服务出现工作线程出现阻塞导致大量请求排队,导致超时,进而影响了综合服务。
我们从2个视角来看
1.从外部服务的视角当工作线程出现阻塞是因为服务出现了超过自身能够处理的流量导致阻塞这个时候往往我们就需要限流。阻塞又是通过各种情况导致比如慢sql。本质还是超过自身能够处理的流量。
2.从综合服务的视角因为调用了外部不稳定的资源,当外部服务出现排队或者故障的时候进而影响了综合服务出现阻塞。
罗生门
1.综合服务视角看起来是因为外部服务挂了导致我服务异常(熔断解决)
2.外部服务视角,综合服务调用QPS超过我自身能力导致异常(限流)
2个视角都没问题,不管是综合服务、外部服务、再或者是网关,他们本质都是服务。所以保证服务高可用的情况下,熔断和限流本质并不冲突。
①限流保护服务自身不会被超过自身处理流量而出现异常
②熔断是保护服务自身不被自身依赖的资源影响而出现服务异常
降级又是什么?
很多时候我们都是说限流/限频,熔断/降级 这样一个组合来说。准确来说只是没有按我们预期逻辑处理的时候的处理措施。
①程序出现空指针后我们try catch catch就是降级处理措施
②我们在spring MVC拦截器统一拦截异常并返回服务器开小差 也是降级处理措施
③当触发限流和熔断规则条件后我们应该如何降级处理?降级为缓存数据?发送告警?
通过上面例子本质是想表达降级只是程序没有按正常逻辑处理的时候我们如何降级处理
关于线程限流的讨论
测试问题
https://github.com/alibaba/Sentinel/issues/3449
相关讨论
https://github.com/alibaba/Sentinel/issues/59
https://github.com/alibaba/Sentinel/issues/1620