限流、降级、熔断有什么区别

发布于:2024-05-22 ⋅ 阅读:(166) ⋅ 点赞:(0)

 限流

        目的:限制系统处理请求的速率,确保系统不会因为过载而崩溃。

        实现:通过对单位时间内允许通过的请求数量进行限制,比如使用令牌桶或漏桶算法。当请求超过设定的阈值时,超出的请求会被拒绝、排队或返回错误信息。

        应用场景:一般是被调用方对调用方进行限流。举个例子,我提供了一个查询用户信息的服务,给集团内外的很多个调用方使用,但是我为了保证我的可用性,我会对每个调用方做限流,防止某个调用方不守规矩,把我的服务打挂了。

降级

        目的:在资源紧张或关键服务不稳定时,暂时降低系统的服务质量或功能,以保证核心服务的正常运行。

        实现:可能包括关闭非核心功能、使用简化逻辑处理请求、返回缓存数据而非实时数据等。

        应用场景:举个例子,双十一大促期间,淘宝上面会把退款功能关闭,这就是一种降级手段,通过把一些非核心功能降级掉来保证核心功能可用。或者在某次腾讯视频挂了的时候,用户名称默认显示腾讯用户,这也是一种降级方式,用兜底名称做展示.

熔断

        目的:防止系统中某个服务的故障导致连锁反应,影响整个系统稳定,类似于电路中的保险丝。

        实现:通过监控服务间的调用成功率和响应时间,当检测到一个服务调用失败率过高或响应过慢时,触发熔断状态,之后对该服务的调用不再真正执行,而是直接返回错误或默认结果,直到服务恢复健康后再尝试重新建立连接。

        应用场景:适用于微服务架构中,当依赖的服务出现问题时,能够快速响应并隔离故障,防止故障扩散。一般发生在调用方,举个例子,当电商平台上用户支付时,收银台发现某个支付渠道,如微信支付失败率突增,超时严重,那么就可以临时把这个支付方式熔断掉。

基于sentile做服务的熔断

@SentinelResource(value = "myServiceMethod",
                   blockHandler = "handleMyServiceBlock")
public String myServiceMethod() {
    // 业务逻辑
}

public String handleMyServiceBlock(BlockException ex) {
    // 降级逻辑,例如返回默认值或错误信息
    return "Service is busy, please try again later!";
}

基于sentile做服务的降级

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;

public class MyService {

    @SentinelResource(
        value = "myServiceMethod", 
        blockHandler = "handleMyServiceBlock"
    )
    public String myServiceMethod() {
        // 业务逻辑
        return "Hello from myServiceMethod";
    }

    public String handleMyServiceBlock(BlockException ex) {
        // 降级逻辑
        return "Service is busy, please try again later!";
    }
}

基于sentile做服务的限流

@SentinelResource(value = "myServiceMethod", blockHandler = "handleFlowException")
public String myServiceMethod() {
    // 业务逻辑
    return "Hello from myServiceMethod";
}

public String handleFlowException(BlockException ex) {
    // 限流后的处理逻辑,比如返回友好提示
    return "Too many requests, please try again later!";
}

以上只是简单的示例, 具体的要根据实际业务场景设计, 记得要有兜底!!


网站公告

今日签到

点亮在社区的每一天
去签到