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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions