在分布式系统中,由于并发高峰或者故障原因,可能会导致某些接口受到超高并发访问压力,从而影响系统性能或者可用性。此时需要对接口进行限流,以保护系统。
常见的限流策略有:
-
滑动窗口计数器:比如每5秒内只允许100个请求通过。
-
漏桶算法:比如每秒20个请求通过,超过的请求丢弃。
-
令牌桶算法:以每秒生成20个令牌的速度,每个请求消耗1个令牌,没有令牌的请求丢弃。
-
固定速率限流:比如每个IP每分钟只允许100个请求。
-
根据用户限流:比如VIP用户每秒50个请求,普通用户每秒10个。
在代码实现上,可以使用限流框架如Sentinel或Guava RateLimiter。
例如使用Sentinel:
-
定义流量规则限流器。
-
在接口上使用@SentinelResource注解并指定流量规则id。
-
规则触发时直接抛出BlockException或返回自定义降级内容。
使用RateLimiter:
-
初始化令牌桶或漏桶限流器。
-
每次请求调用rateLimiter.acquire()方法获取令牌。
-
无令牌直接抛异常或降级返回。
限流策略需要根据实际业务场景灵活选择,可以有效保护系统免受超高并发访问压力影响。它是系统容量设计的一个重要保障措施。
在实际项目中,限流策略的实现可以结合多种方式:
-
根据接口类型分层限流:如公共接口低层限流,核心业务接口高层限流。
-
结合黑白名单限流:将恶意用户或风险IP限流在外。
-
限流粒度细化:根据IP、用户、设备标识等细化限流维度。
-
动态调整限流阈值:根据QPS变化实时调整限流数量。
-
限流结果缓存:将限流结果缓存起来提高效率。
-
限流排队处理:高并发下将超限请求加入队列等待。
-
限流异常处理:限流时返回友好提示或降级结果。
-
限流情景切换:正式环境与测试环境限流策略不同。
-
限流指标监控:监控接口限流次数提醒优化。
-
限流与熔断结合:限流触发后进行熔断处理。
-
分布式限流:使用分布式锁或者消息队列实现限流。
-
限流算法选择:根据场景选择不同限流算法。
-
限流框架选择:Sentinel、GuavaRateLimiter等限流能力强的框架。
正确使用上述方法,可以高效且智能地对接口流量进行管理和保护,让系统应对超高并发更加健壮。