资讯动态

octo-server三层限流中间件完全指南:从IP防刷到UID共享配额

发布时间:2026/10/15 15:32:08 来源:尧图企业网站定制
【免费下载链接】octo-server The Go backend powering OCTO — an open workplace built for humans × AI agents. REST WebSocket APIs, Lobster (AI agent) orchestration, and WuKongIM real-time messaging control plane.项目地址https://gitcode.com/gh_mirrors/oc/octo-server点击查看免费下载octo-server 是 OCTO 开源工作区平台的 Go 后端为 REST 与 WebSocket API 提供了一套三层限流中间件体系全局 per-IP 令牌桶兜底 DDoS、端点级 StrictIP 桶保护未鉴权敏感接口、UID 共享配额桶约束每个登录用户。本文带你快速看懂这套限流架构的设计思路、默认配额与热调机制新手也能轻松上手。 为什么需要三层限流一次真实的生产事故2026 年 8 月 5 日一次真实事故暴露了单一限流维度的致命弱点/v1/bot接口此前只有全局 per-IP 限流而同一出网 IP 上的所有 bot 共享一份配额。一个 bot 以约 590 rps 冲刷心跳接口直接把配额打满同 IP 的其他 bot 全部连坐收到 429其中一个 bot 断联且无法自愈。这促使 octo-server 把限流从单一维度演进为分层防御不同身份的流量互不干扰——按 bot 身份分桶而不是按出网 IP未鉴权端点有自己的严格桶——登录、注册、短信等接口独立设防登录用户的配额跨路由共享——一个 UID 全站一份令牌桶防止接口拆分绕过。相关设计约定可参考项目文档 CLAUDE.md 中的 Rate Limiting 章节。 三层限流结构一览octo-server 的三个限流中间件都基于 Redis 令牌桶都会下发X-RateLimit-Limit / Remaining / Scope / Retry-After响应头并在 Redis 故障时fail-open放行降级中间件限流维度Scope 头适用场景RateLimitMiddleware全局 per-IPipDDoS 底线在 main.go 全局挂载StrictIPRateLimitMiddleware单端点 per-IPstrict:{tag}未鉴权敏感端点登录/注册/短信/搜索/群邀请等SharedUIDRateLimiter每登录用户共享桶ratelimit:uid:{uid}uid已鉴权端点的默认选择第一层全局 per-IP 桶DDoS 底线在 main.go 中通过route.Use挂载到所有路由默认500 rps / burst 1000可通过环境变量DM_API_RATELIMIT_RPS、DM_API_RATELIMIT_BURST调整状态存 Redis多副本共享配额——注意配置的 rps 是全站合计不是每个副本各 500少数路径会被豁免/v1/ping、/v1/health、/v1/bot/heartbeat、/v1/bot/register但豁免不等于无限制被豁免的保命端点必须另有自己的配额这条不变量由测试结构性钉住。为什么是 500注释里写得很直白办公室共享出网 IP 下 IM 基础量就能到 100 rps200 余量太小而真实 DDoS 常达数千 rps底线设 500 更合理精细限流交给 UID 层和端点级严格桶。第二层StrictIP 端点级 IP 桶未鉴权敏感接口登录、注册、短信、搜索等接口在鉴权之前就只能用 IP 作为限流维度StrictIPRateLimitMiddleware(tag, rps, burst)为每个端点建一个独立 IP 桶strict:{tag}防止单一 IP 对敏感接口无限刷取。Bot API 的register100 rps / burst 500与heartbeat500 rps / burst 1500也是这一层见 modules/bot_api/ratelimit.go 的完整论证。第三层UID 共享配额桶登录用户默认SharedUIDRateLimiter是进程级单例每个登录 UID 全站共享一个桶ratelimit:uid:{uid}默认2 rps / burst 60可通过DM_API_UID_RATELIMIT_RPS/DM_API_UID_RATELIMIT_BURST调整必须挂在AuthMiddleware之后否则读不到 UID 会静默放行fail-open一个用户无论打哪个已鉴权接口消耗的都是同一份配额——这是防接口拆分绕限流的关键。 令牌桶核心Redis Lua 保证原子性三层桶共用同一套 Lua 脚本pkg/ratelimit/bucket.go 可逐字节审计按rps速率给桶补令牌上限为burst有令牌则扣 1 放行否则计算retry_after秒数拒绝拒绝路径跳过写回避免 DDoS 下的写放大——因为桶状态是纯函数不写回不丢信息桶 key 自动设置 TTL闲置桶会被 Redis 自然回收。两个值得记住的健壮性设计fail-openRedis 是 IM 核心依赖它挂掉时系统已失能限流层若反而开始拒绝会把基础设施抖动放大成业务不可用。降级会打节流告警并上报独立指标保证限流没在工作在监控上一眼可见读侧消毒SanitizeRPS / SanitizeBurst会拦截 NaN、±Inf、≤0 等非法配置值strconv.ParseFloat会原样接受 NaN非法值回退到代码内的安全默认绝不退化成放行。 特例Bot API 的三条 per-bot 通道Bot API 的流量形态特殊机器人车队规模大、心跳保命、token 刷新自愈所以在通用三层之外又建了三条按 bot 身份的独立通道配额可运行时热调改system_setting最多 60 秒生效无需重启通道限流维度默认配额说明businessrobotID20 rps / burst 200/v1/bot主组业务端点heartbeatrobotID1 rps / burst 10心跳保命通道rps 有结构性下界registertoken 指纹SHA-256 前 16 字节0.5 rps / burst 10鉴权前无身份用凭据哈希做维度三条通道默认关闭 影子模式enabledfalse / dry-runtrue见 modules/common/system_settings.go先观测真实流量再逐步收紧配额。几个精巧细节heartbeat 有 rps 下界低于下界意味着一次被限流就可能让心跳 key 过期这条保命通道反而变成了断联成因register 只落 token 哈希凭据绝不进 Redis key、日志或指标防失效 token 重试风暴事故中曾以 4 rps 持续重试影子期不下发限流头否则客户端会自行降频观测到的就不再是真实流量。️ 运维速查热调、影子模式与响应头热调per-bot 通道配额走system_setting数据库 → env → 代码默认值的回退链改库约 60 秒生效全局 IP 桶与 UID 桶走环境变量如DM_API_RATELIMIT_RPS改 configmap 滚动重启kill switch每层都有enabled开关误伤时用它止损比回滚发版快一个数量级响应头被限流时返回标准429而不是 400客户端按状态码决定退避并携带X-RateLimit-Limit: 60 # 本次判定使用的桶容量 X-RateLimit-Remaining: 42 # 剩余令牌 X-RateLimit-Scope: uid # 维度ip / strict:xxx / uid / bot Retry-After: 2 # 建议等待秒数客户端只认状态码 Retry-After就能做指数退避无需关心后端限流细节。 延伸阅读限流原语与判定状态机pkg/ratelimit/limiter.go、pkg/ratelimit/bucket.go违规者 Top-N 记录只记拒绝、防观测放大pkg/ratelimit/offenders.goBot API 三通道完整设计论证modules/bot_api/ratelimit.go全局桶挂载与豁免路径main.goBot API 路由与三层顺序IP 底线 → 鉴权 → per-bot 桶modules/bot_api/bot_api.go一句话总结IP 层管别打爆StrictIP 层管敏感接口别被刷UID 层管单用户别滥用Bot 通道管单机器人别连坐邻居——每一层各管一段互为兜底这正是这套限流体系在真实事故中打磨出来的分层智慧。赞分享【免费下载链接】octo-server The Go backend powering OCTO — an open workplace built for humans × AI agents. REST WebSocket APIs, Lobster (AI agent) orchestration, and WuKongIM real-time messaging control plane.项目地址https://gitcode.com/gh_mirrors/oc/octo-server点击查看免费下载相关推荐Farm 配置完全指南从 farm.config 文件到编译、Dev Server 与共享选项Farm 配置完全指南从 farm.config 文件到编译、Dev Server 与共享选项 导读 Farm 是一款使用 Rust 编写、兼容 Vite 生前端构建构建工具开发工具Fresh 中间件Middleware完全指南拦截请求、共享状态与分层路由Fresh 中间件Middleware完全指南拦截请求、共享状态与分层路由 导读 在 Fresh 中中间件Middleware是定义在 _middl后端前端ToolJet 数据源Data Sources完全指南从连接到共享、权限与底层实现ToolJet 数据源Data Sources完全指南从连接到共享、权限与底层实现 ToolJet 是一个用于构建内部工具、仪表盘、业务应用、工作流与 A低代码后端前端AI 应用MCP 服务创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑