Skip to content
bitzorcas
中EN

Reference

多租户与分布式限流:RateLimiter 策略与防刷

掌握 BitzOrcas.Modern 企业级高并发限流体系,深入 ASP.NET Core RateLimiter 算法(滑动窗口/令牌桶)、多租户配额动态隔离与 Redis 分布式防护。

Last updated

在高并发与多租户 SaaS 系统中,如果没有精细化的限流防护,单个恶意或高频租户极易将整个集群拖垮:

  • 吵闹邻居效应(Noisy Neighbor):租户 A 正在用爬虫高频调用接口,耗尽了整个数据库连接池,导致租户 B 的正常业务全部超时;
  • 暴力破解与 DDoS 攻击:登录端点被黑客高频撞库,导致服务器 CPU 100% 飙升。

BitzOrcas.Modern 原生集成了基于租户与用户维度的细粒度限流策略:支持滑动窗口(Sliding Window)、固定窗口与并发排队,并在超限时返回标准的 HTTP 429 Too Many Requests。

多租户限流流转与配额隔离全景

未超限 (拥有可用令牌)超限 (令牌耗尽)

1. 入站请求 (识别 TenantId / IP)

2. ASP.NET Core Rate Limiter 中间件

3. 动态计算分区键 (PartitionKey: tenant-001:login)

4. 配额评估 (滑动窗口 / 令牌桶)

5. 放行进入业务管道与 Handler

6. 立即拦截并返回 429 Too Many Requests (附带 Retry-After)


第一步:在 Minimal API 端点上声明限流策略

通过 [GenerateEndpoint] 或中间件直接绑定预配置的限流策略名称:

SendVerificationCodeCommand.cs: 绑定防刷限流策略
using BitzOrcas.Domain.Results;
using BitzOrcas.Endpoint.Attributes;
using Mediator;
namespace BitzOrcas.Identity.Application.Commands;
// 1. 声明短信发送严格限流策略(单 IP 每分钟最多 3 次)
[GenerateEndpoint(
HttpRoute.Post,
"/api/auth/send-code",
Tag = "Auth",
RateLimitPolicy = "smsVerificationPolicy")]
// 2. 纯契约 Record,底层由 Minimal API 自动绑定并挂载限流拦截
public sealed record SendVerificationCodeCommand(string PhoneNumber) : ICommand<Result>;

第二步:配置基于租户与客户端的动态限流分区

在 Host 启动配置中声明分区限流器:

RateLimitingConfiguration.cs: 分区限流策略配置
using System.Threading.RateLimiting;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
public static class RateLimitingConfiguration
{
public static IServiceCollection AddAppRateLimiting(this IServiceCollection services)
{
// 注册 ASP.NET Core 官方 RateLimiter 服务
services.AddRateLimiter(options =>
{
// 针对短信验证码配置严格滑动窗口
options.AddPolicy("smsVerificationPolicy", httpContext =>
{
// 1. 基于客户端真实 IP 与手机号联合建立限流分区
var clientIp = httpContext.Connection.RemoteIpAddress?.ToString() ?? "unknown";
return RateLimitPartition.GetSlidingWindowLimiter(
partitionKey: $"sms:{clientIp}",
factory: _ => new SlidingWindowRateLimiterOptions
{
PermitLimit = 3,
Window = TimeSpan.FromMinutes(1),
SegmentsPerWindow = 6,
QueueLimit = 0
});
});
// 超限统一返回 429 状态码与重试头
options.RejectionStatusCode = StatusCodes.Status429TooManyRequests;
});
return services;
}
}

总结

BitzOrcas 的限流体系保护系统稳健运行:

  • 彻底杜绝吵闹邻居:按租户/IP 动态隔离配额,互不影响;
  • AOT 友好:基于标准 .NET 10 RateLimiter 零反射实现;
  • 标准协议响应:429 状态码与 Retry-After 头让客户端清晰感知降级策略。

100%

滚轮或按钮缩放 · 放大后拖动画面 · 双击切换 100% / 200%