在高并发与多租户 SaaS 系统中,如果没有精细化的限流防护,单个恶意或高频租户极易将整个集群拖垮:
- 吵闹邻居效应(Noisy Neighbor):租户 A 正在用爬虫高频调用接口,耗尽了整个数据库连接池,导致租户 B 的正常业务全部超时;
- 暴力破解与 DDoS 攻击:登录端点被黑客高频撞库,导致服务器 CPU 100% 飙升。
BitzOrcas.Modern 原生集成了基于租户与用户维度的细粒度限流策略:支持滑动窗口(Sliding Window)、固定窗口与并发排队,并在超限时返回标准的 HTTP 429 Too Many Requests。
多租户限流流转与配额隔离全景
第一步:在 Minimal API 端点上声明限流策略
通过 [GenerateEndpoint] 或中间件直接绑定预配置的限流策略名称:
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 启动配置中声明分区限流器:
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头让客户端清晰感知降级策略。