限流 面试
如果使用sentinel进行限流:我们可以通过QPS或者并发线程数,一般在项目中我们推荐使用QPS来进行限流。
如果使用sentinel进行熔断:我们可以根据慢调用比例、异常比例、异常数来进行熔断。
网关我们可以采用信号量隔离,业务层我们可以使用线程池隔离的策略。
说一下令牌桶算法(面试有被问到)
核心思想:
存在一个固定大小的桶来存放token。
约定用户必须拿到token才能进行后续处理。
每隔一段时间就往桶里放k个新的 token。
如果桶里没有token就拒绝服务。
当然如果对于没有来得及处理的任务,我们也可以先将其放入到队列当中。
说一下sentinel底层是怎样实现限流的?(面试有被问到)
Sentinel 通过动态管理限流规则,根据定义的规则对请求(这里的请求说白了就是资源)进行限流控制。具体实现步骤如下:
-
定义资源:在 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"); } -
配置限流规则:在 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(每秒请求数)、线程数、响应时间等。

限流控制:当请求到达时,sentinel会根据资源的限流规则判断是否需要进行限流控制。如果请求超过了限流阈值,则可以进行限制、拒绝或进行其他降级处理。
Sentinel 采用的什么限流算法?
Sentinel 使用滑动窗口限流算法来实现限流。
滑动窗口限流算法是一种基于时间窗口的限流算法。它将一段时间划分为多个时间窗口,并在每个时间窗口内统计请求的数量。通过动态地调整时间窗口的大小和滑动步长,可以更精确地控制请求的通过速率。
Sentinel 怎么实现集群限流?
Sentinel 利用了 Token Server 和 Token Client 的机制来实现集群限流。
开启集群限流后,Client 向 Token Server 发送请求,Token Server 根据配置的规则决定是否限流。
浙公网安备 33010602011771号