Skip to content

「v17」入站 rateLimit 接执行:ApiEndpoint / HttpServer 的 RateLimitConfig 推导为 runtime token bucket 配置,dispatcher 生效(#4686 拆向之一) #4910

Description

@xuyushun441-sys

Part of #4686。维护者裁决(2026-08-03,PM 会话 session_01Ehu85kbvMcrNTUJjwxvLJ9 经 AskUserQuestion):拆向 —— 入站接执行,出站摘除。本单是入站半边;出站半边(connector 侧摘除)见兄弟子单,两者相互独立、不共享文件面。

事实基础(#4686 立单 + 2026-08-03 复核,C9 改名后)

  • packages/spec/src/shared/http.zod.ts:127RateLimitConfigSchema,三个嵌入点全部从作者面可达:
    • api/endpoint.zod.tsApiEndpointSchema.rateLimit
    • api/registry.zod.tsApiEndpointRegistrationSchema.rateLimit
    • system/http-server.zod.tsHttpServerConfigSchema.security.rateLimit
  • 全仓零 runtime reader(spec 之外零命中,阳性对照已验证扫描器有效)。作者写下去解析通过,然后什么也不发生。
  • packages/runtime/src/security/rate-limit.ts 有一个真正在干活的 in-memory token bucket(RateLimitBucketConfig:capacity / refillPerSec / defaultCost),服务入站 dispatcher 的 429 短路,但不 import spec

范围

把作者面声明接到已存在的执行器上:

  1. 从授权配置推导 bucket 配置(ADR-0049:spec 两份 RateLimitConfig 全仓零 reader,真正在限流的是 runtime 自己的第三份形状 #4686 给的推导:capacity = maxRequests,refillPerSec = maxRequests / (windowMs / 1000) —— 以实际 schema 键为准,开工先核 origin/main 现状)。
  2. 接线三个嵌入点;endpoint 级与 server 级的优先级语义由实现者提出并写进 schema describe + 文档(建议:endpoint 覆盖 server,与同文件既有 security 语义一致,不确定就升级)。
  3. 逐键活性:接线后 RateLimitConfigSchema 的每个键要么被执行器消费、要么按 ADR-0049 退役 —— 不允许接了一半、剩下的键继续静默(未知键静默剥离仍是全仓默认:把 #3405 的 strict 收紧从一个 schema 推广到整个可授权面(ADR-0078 完整性闸门) #4001 战役的 declared = enforced 不变量)。哪些键 bucket 表达不了(如有 burstCapacity / respectUpstreamLimits 一类),逐键实测后处置,不猜。

⚠️ 激活语义 = 本单的 breaking 面

存量栈里写过 rateLimit 配置的,升级 v17 后从「惰性」变「真限流」—— 可能开始吃 429。这是有意的(declared = enforced 的强实现),但必须:

  • ADR-0087 D3 semantic migration 条目 + upgrade guide(走生成管线,不手编);
  • major changeset,FROM → TO 写清「你的配置将开始生效」;
  • v17 窗口内落地(.changeset/pre.json mode:pre / tag:rc 关闭后无 major 通道)。

验收

  • 一条端到端测试:授权 rateLimit 配置经真实 dispatcher 路径产生 429(declared=enforced 探针,先证红:未接线时同配置不限流)。
  • 逐键消费证据或退役登记,无静默残留键。
  • spec 十道 check:* + 全仓 typecheck 绿;三个示例应用 validate 过。
  • ⛔ 不碰 content/docs/releases/;出站/connector 侧零改动(那是兄弟子单的面)。

关联:#4686(父单,裁决记录)、#4684(C9 改名收敛,已关)、ADR-0049、ADR-0087、Prime Directive #10

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions