Sentinel 限流原理分析主要包括以下几个关键部分:
资源定义与识别
- 在 Sentinel 中,首先需要将待保护的接口、服务或者方法等抽象为一个“资源”。资源是 Sentinel 进行流量控制的基本单元。
令牌桶算法
- Sentinel 实际上采用的是基于滑动窗口的令牌桶算法(虽然文档中提到它也支持漏桶算法)。令牌桶算法的主要思想是系统以恒定速率生成令牌放入桶中,请求到达时会从桶中尝试获取令牌,只有拿到令牌的请求才能通过。如果桶内无令牌可取,则请求会被拒绝或进行相应的处理(如等待、降级等)。
滑动窗口统计
- Sentinel 的限流实现并不是直接使用传统的固定窗口或滑动窗口计数器来计算 QPS,而是自研了一套滑动窗口算法用于实时统计和分析资源访问情况,更精确地控制每秒的请求量,并且在高并发情况下能保持较好的性能和准确性。
规则配置与匹配
- 用户可以在 Sentinel 控制台或通过 API 动态配置限流规则,规则可以包括资源名、限流策略(如 QPS 或线程数)、阈值等信息。当一个请求到来时,Sentinel 会根据资源名称找到对应的限流规则进行匹配。
流量控制逻辑
- 当请求进入 Sentinel 框架后,框架会在入口处创建一个
Entry
对象,这个对象代表了对该资源的一次调用尝试。通过调用SphU.entry(resourceName)
方法, Sentinel 会检查当前资源是否满足限流条件:- 如果桶中有足够的令牌,则允许请求通过并返回一个有效的
Entry
。 - 若没有足够令牌,Sentinel 将抛出
BlockException
异常,应用可以通过捕获该异常实现自定义的限流后的处理逻辑,比如返回错误码、提示信息或跳转到降级页面等。
- 如果桶中有足够的令牌,则允许请求通过并返回一个有效的
动态调整与集群协调
- Sentinel 支持动态修改规则并在客户端实时生效,同时在分布式场景下,多个实例间的限流可以通过统一的数据源进行协调,确保整个集群的限流效果一致。
综上所述,Sentinel 通过精细化的资源管理、高效的令牌桶算法、灵活的规则配置以及强大的动态调整能力,实现了对系统资源的有效保护和流量控制。