限流 面试

如果使用sentinel进行限流:我们可以通过QPS或者并发线程数,一般在项目中我们推荐使用QPS来进行限流。
如果使用sentinel进行熔断:我们可以根据慢调用比例、异常比例、异常数来进行熔断。

网关我们可以采用信号量隔离,业务层我们可以使用线程池隔离的策略。

说一下令牌桶算法(面试有被问到)

核心思想:

存在一个固定大小的桶来存放token。

约定用户必须拿到token才能进行后续处理。

每隔一段时间就往桶里放k个新的 token。

如果桶里没有token就拒绝服务。

当然如果对于没有来得及处理的任务,我们也可以先将其放入到队列当中。

说一下sentinel底层是怎样实现限流的?(面试有被问到)

Sentinel 通过动态管理限流规则,根据定义的规则对请求(这里的请求说白了就是资源)进行限流控制。具体实现步骤如下:

  1. 定义资源:在 Sentinel 中,资源可以是 URL、方法等,用于标识需要进行限流的请求。比方说我们项目中使用的资源就是接口编码。

    // 原本的业务方法.
    @SentinelResource(blockHandler = "blockHandlerForGetUser")
    public User getUserById(String id) {
        throw new RuntimeException("getUserById command failed");
    }
    
    // blockHandler 函数,原方法调用被限流/降级/系统保护的时候调用
    public User blockHandlerForGetUser(String id, BlockException ex) {
        return new User("admin");
    }
    
  2. 配置限流规则:在 Sentinel 的配置文件中定义资源的限流规则。规则可以包括资源名称、限流阈值、限流模式(eg:并发线程数orQPS)等。

private static void initFlowQpsRule() {
    List<FlowRule> rules = new ArrayList<>();
    FlowRule rule1 = new FlowRule();  // 创建一个流控规则
    rule1.setResource(resource);    // 设置要限流的资源名称
    rule1.setCount(20);  // 设置最大 QPS 为 20
    rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);  // 设置限流的维度为 QPS
    rule1.setLimitApp("default");  // 设置限制的应用名称为 "default"
    rules.add(rule1);  // 将规则添加到规则列表中
    FlowRuleManager.loadRules(rules); // 加载规则列表,使限流规则生效
}

监控流量:sentinel会监控每个资源的流量情况,包括请求的QPS(每秒请求数)、线程数、响应时间等。

image-20250814151309610

限流控制:当请求到达时,sentinel会根据资源的限流规则判断是否需要进行限流控制。如果请求超过了限流阈值,则可以进行限制、拒绝或进行其他降级处理。

Sentinel 采用的什么限流算法?

Sentinel 使用滑动窗口限流算法来实现限流。

滑动窗口限流算法是一种基于时间窗口的限流算法。它将一段时间划分为多个时间窗口,并在每个时间窗口内统计请求的数量。通过动态地调整时间窗口的大小和滑动步长,可以更精确地控制请求的通过速率。

Sentinel 怎么实现集群限流?

Sentinel 利用了 Token Server 和 Token Client 的机制来实现集群限流。

开启集群限流后,Client 向 Token Server 发送请求,Token Server 根据配置的规则决定是否限流。

posted on 2024-10-27 19:18  ~码铃薯~  阅读(14)  评论(0)    收藏  举报

导航