① 先把后文会反复出现的词认清楚
先认词:这一课会同时讨论“用户怎么进入服务”“服务器怎么访问上游”“长连接为什么会卡”和“Clash 为什么开了 Global 还可能没接管流量”。先把控制位置不同的术语分开,再做综合判断。
Network Path · 网络路径 / 链路一个请求从起点到终点实际经过的网络节点与连接段。
- 直觉
- 不是只看起点和终点,而是看中间到底走了哪条路。
- 当前案例
- 大陆直连新加坡与“大陆→香港→新加坡”是两条不同路径,质量必须分别测。
- 边界
- 地理距离不能唯一决定网络路径,运营商互联、BGP 路由、拥塞和跨境出口都会改变实际体验。
Ingress / Egress · 入站 / 出站Ingress 是请求进入服务系统的方向;Egress 是服务访问外部上游的方向。
- 直觉
- 站在 Sub2API 这个系统里看,用户进来叫 ingress,Sub2API 去找模型上游叫 egress。
- 当前案例
- 大陆用户→新加坡是不稳定的 ingress;新加坡→GPT/Claude 是另一条 egress。
- 边界
- 给 egress 配代理不会自动改变已经发生在 ingress 上的路由。
Forward Proxy · 前向代理站在客户端一侧,代表客户端去访问外部目标的代理。
- 直觉
- 用户先把请求交给自己的代理,再由代理替用户去访问目标。
- 当前案例
- Clash/mihomo 装在个人电脑上时,典型角色就是前向代理。
- 边界
- 它解决的是这个客户端自己的出站路径,不会自动改善其他客户。
Reverse Proxy · 反向代理站在服务端一侧,先接住用户请求,再把请求转给内部源站。
- 直觉
- 用户以为自己在访问服务本身,实际上先到一个官方前门。
- 当前案例
- 香港 Caddy/Nginx 是
ai.rest2build.lol的前置入口,再转发到新加坡 Sub2API。 - 边界
- 反向代理不是数据库副本;它可以无状态,只承担网络接入。
Origin Server · 源站真正承载业务逻辑和状态、被前置代理转发访问的后端服务。
- 直觉
- 前门后面真正办事的地方。
- 当前案例
- 新加坡 Sub2API 仍是 origin,账号、鉴权、计费、数据库和 Redis 都留在那里。
- 边界
- 把 DNS 指向香港并不等于迁移源站。
Round-Trip Time (RTT) · 往返时延一个网络往返所需的时间,用来观察链路本身的基础延迟。
- 直觉
- 发一个很小的信号过去再回来,需要多久。
- 当前案例
- 用于比较大陆→香港、大陆→新加坡等路径的网络基础成本。
- 边界
- RTT 低不等于 HTTP 首字节一定快,因为服务器处理和上游等待不在纯 RTT 里。
Time to First Byte (TTFB) · 首字节时间从客户端开始请求,到收到 HTTP 第一个响应字节的总等待时间。
- 严格一点
- TTFB 会叠加 DNS、连接、TLS、代理、应用处理和上游等待,因此比 RTT 更接近“用户等多久才看到服务开始响应”。
- 当前案例
- 健康接口 TTFB 可用于隔离入口质量,真实模型 TTFB 还包含模型上游首 token 等待。
TLS Termination · TLS 终止HTTPS 加密连接在某个代理节点结束解密,再由该节点继续转发。
- 直觉
- 香港入口先和客户端完成 HTTPS 握手,然后再建立到新加坡的受保护连接。
- 当前案例
- 证书、SNI 和 443 连接首先由香港入口处理。
- 边界
- TLS 在香港终止意味着香港进程会处理解密后的 HTTP 请求,因此仍需日志脱敏和主机安全。
Server-Sent Events (SSE) · 服务器发送事件基于长时间 HTTP 响应,由服务器持续向客户端推送小块数据的流式机制。
- 直觉
- 连接不立刻结束,服务器不断往同一条 HTTP 响应里追加事件。
- 当前案例
- 模型 token 流式返回时,代理缓冲或超时会直接影响“字一个个出来”还是“憋一坨才出来”。
- 边界
- SSE 主要是服务器→客户端单向推送,不等同于 WebSocket 的双向消息通道。
WebSocket · WebSocket 双向长连接从 HTTP 握手升级出的持久双向连接,客户端和服务端都能持续发消息。
- 当前案例
- 若客户端或上游协议使用 WebSocket,香港反向代理必须正确处理 Upgrade 和长时间连接。
- 边界
- 普通 HTTPS 请求成功不能证明 WebSocket 一定能建立和维持。
Proxy Buffering · 代理缓冲代理先收集一部分上游响应,再批量向客户端发送的行为。
- 直觉
- 像快递站等包裹攒一车再发;对下载可能有益,对实时 token 流可能造成明显停顿。
- 当前案例
- SSE 路径应验证代理没有把小 chunk 长时间积压。
- 边界
- “关闭缓冲”应针对需要实时流式的接口,不代表整个站点所有响应都必须禁用任何缓存机制。
WireGuard Tunnel · WireGuard 隧道在两个受控节点之间建立加密三层隧道,把公网传输变成受控的虚拟私有链路。
- 当前案例
- 香港→新加坡可以走 WireGuard,让新加坡业务端口只对隧道地址开放。
- 边界
- WireGuard 位于香港到新加坡这一段,不会自动改善大陆用户到香港的接入质量;MTU 等配置也需要真实负载测试。
System Proxy · 系统代理操作系统提供的 HTTP/HTTPS/SOCKS 代理设置,只有遵循这些设置的应用才会使用它。
- 当前案例
- Clash 开了 Global 但应用仍直连时,要先确认应用流量是否真的进入系统代理。
- 边界
- 某些 UDP、QUIC、自带网络栈或忽略系统代理设置的程序可能绕过这一层。
TUN Interface · TUN 虚拟网络接口在 IP 层接管较广范围系统流量,再交给代理软件决定直连或转发。
- 直觉
- 不是等应用主动来找代理,而是在更底层把经过虚拟网卡的包接住。
- 当前案例
- Rule + TUN 常用于让目标服务走代理、国内流量继续直连;Global + TUN 更适合短时间强制诊断。
- 边界
- TUN 覆盖更广但不是“数学意义上的所有流量”,仍受路由、排除项、权限和平台实现约束。
② 现在再看这段材料到底在说什么
一句话本质:如果真正不稳定的是“用户 → 新加坡 Sub2API”这一段,那么你必须改变用户进入系统的路径;只在新加坡服务器里增加出站代理,只会改变“Sub2API → GPT/Claude 上游”这一段,无法倒过来修复已经发生在用户侧入口之前的连接问题。
用户入站:
C → S,其中 C 是中国大陆客户端,S 是新加坡 Sub2API。服务器出站:
S → U,其中 U 是模型上游。给
S 配 mihomo/代理只改变第二条路径;要改善第一条路径,必须把它改成 C → H → S,其中 H 是香港接入节点。因此,“香港节点”不是把整个业务搬到香港,也不是第二套数据库。更准确地说,它是一个前置接入层:客户端先连接一个更容易稳定到达的香港入口,入口完成 TLS、长连接保持和反向代理,再把请求转发到仍然位于新加坡的业务源站。新加坡继续负责账号、鉴权、计费、渠道调度、数据库和 Redis,香港尽量保持无状态。
你给出的现状
新加坡应用内部处理约 1 ms、Caddy 约 5.5 ms。如果这个测量稳定成立,而大陆侧仍出现秒级等待或连接失败,优先怀疑广域网路径、握手和跨境链路,而不是应用 CPU 本身。
正确改动位置
把 ai.rest2build.lol 的入口指向香港接入节点,让香港成为用户可见的公网前门;新加坡则退到受保护的 origin。
不能混淆
“客户端开 Clash”是每个用户各自改变自己的出站路径;“香港反向代理”是服务提供方统一改变所有用户进入服务的路径。二者解决问题的位置完全不同。
从左到右按请求方向看四个位置;重点区分前两段属于用户入站,最后一段属于服务器出站。返回流量沿相反方向经过同一接入链。
Codex、Claude Code 或浏览器先发起 HTTPS / SSE / WebSocket 请求;这里是用户入站路径的起点。
公网前门终止 TLS、保持长连接并做反向代理,把用户先接到更可控的入口;这一层尽量无状态。
账号、鉴权、计费、渠道调度、数据库与 Redis 仍留在源站;香港不是第二套业务系统。
GPT / Claude 等上游属于服务器 egress 路径;在新加坡配置 mihomo 只会改变这一段的出站选择。
结论:香港接入把用户入站从“大陆客户端直接跨境到新加坡源站”改成“大陆客户端 → 香港入口 → 新加坡源站”;新加坡侧的 egress proxy 只影响“源站 → 模型上游”,不会反向修复用户已经经历过的入站链路。
边界:这是网络角色与控制位置示意,不代表实际 BGP 物理跳数,也不证明香港方案一定更快;是否改善必须用大陆→香港、香港→新加坡和端到端 HTTPS/流式请求实测。
③ 概念关系与最小知识闭包
1. 概念分类关系:它在网络体系里属于什么?
| 层级 | 概念 | 定义 | 在本案例中的位置 |
|---|---|---|---|
| 上位 | 互联网服务交付架构 | 决定用户请求经过哪些网络、入口、代理、源站与上游的整体结构。 | 整个 rest2build 的访问路径。 |
| 当前核心 | 前置接入层 / Ingress Reverse Proxy | 在业务源站前放置一个更靠近用户或线路更优的入口,统一接收并转发请求。 | 香港优化线路节点。 |
| 下位机制 | DNS 切流、TLS 终止、长连接转发、源站保护、隧道 | 把“入口”真正变成可工作的生产接入层所需的具体机制。 | Caddy/Nginx + WireGuard + ACL。 |
| 并列方案 | 客户端前向代理、服务器出站代理、边缘网络/CDN | 都可能改变网络路径,但控制的位置和能修复的故障不同。 | Clash、mihomo、Edge 产品。 |
2. 学习依赖关系:应该按什么顺序理解?
3. 一个主比方:把接入层想成“离客户更近的收件站”
可以把整个系统想成跨城物流。中国大陆用户是寄件人,新加坡 Sub2API 是中央仓库,模型上游是更远的供应商。服务器出站代理相当于中央仓库换了一家“去供应商的运输公司”;它可以改善仓库到供应商,但如果寄件人连中央仓库的大门都经常堵住,这个变化对寄件人的第一段路没有帮助。
香港反向代理则像在离寄件人更近、线路更稳定的位置增加一个官方收件站:用户只需要把包裹交到香港,香港再用稳定干线送到新加坡中央仓库。中央仓库仍然负责订单、库存和结算,所以业务状态没有被复制到香港。
| 物流比方 | 技术对象 |
|---|---|
| 寄件人 | 中国大陆客户端 / Codex / Claude Code |
| 香港收件站 | 前置 Reverse Proxy / Ingress |
| 中央仓库 | 新加坡 Sub2API 源站 |
| 去供应商的运输公司 | 新加坡 mihomo / egress proxy |
| 专用封闭干线 | WireGuard 隧道 |
| 边装满一车再发 | 代理缓冲;对流式 token 体验通常不理想 |
最小知识闭包 1:为什么“出站代理”修不好“入站链路”?
把网络看成有向图。客户端 C 到新加坡源站 S 的入站路径记为 P_in(C,S);新加坡源站到模型上游 U 的出站路径记为 P_out(S,U)。服务器里的 mihomo 改变的是后者的路由选择函数,而不是前者。
如果坏的是第一项,你只优化第二项,第一项仍然坏。香港前置接入的作用,就是把第一项的路径结构改写为 C → H → S。
最小知识闭包 2:多一跳为什么反而可能更快、更稳?
“少一跳一定更快”是常见误区。互联网不是欧氏平面上的直线距离问题。真正决定路径质量的是运营商互联、跨境出口、拥塞、路由绕行、丢包和对端接入质量。香港节点虽然增加一个逻辑中转,但如果大陆到香港和香港到新加坡的两段都比大陆直接到新加坡更稳定,总体验可以改善。
这里 ε_proxy 是香港代理自身增加的处理开销。对于纯转发的 Caddy/Nginx,它通常应远小于公网路径差异;但这需要实测,不能靠机房宣传词推断。
最小知识闭包 3:RTT 与 TTFB 看的是不同东西
RTT更接近“网络来回一趟要多久”;TTFB则是“从客户端发起请求,到收到 HTTP 第一个响应字节总共等了多久”。TTFB 会叠加 DNS、TCP/TLS 握手、代理排队、应用处理和上游等待,所以 RTT 正常而 TTFB 很大,不能直接下结论说“线路没问题”。
最小知识闭包 4:流式接口不是普通短请求
模型 API 常常不是“请求 → 几十毫秒返回一个完整 JSON”这么简单。流式响应会保持连接很久,并持续吐出小块数据。SSE 是服务器单向持续推送;WebSocket 是双向长连接。对这类连接,代理若默认缓冲、空闲超时太短、读超时太短,都会造成“首包正常但后面卡住”“token 一坨一坨出来”或中途断流。
普通短请求:
client ── request ──→ proxy ──→ origin
client ←── whole response ──────── origin
流式请求:
client ← chunk ← chunk ← chunk ← ... (连接持续存在)
最小知识闭包 5:30 次无超时不能证明 99.9%
“30 次冷连接没有失败”是一个有价值的 smoke signal,但统计上远不足以支持“成功率至少 99.9%”。如果把每次连接近似看成独立伯努利试验,零失败时常用 rule of three 粗估 95% 置信上界:失败率 q ≈ 3/n。
因此 n=30 时只能粗略排除“非常高的失败率”;若希望用零失败样本把 95% 上界压到 0.1% 左右,量级上需要约 3000 次,而且还要跨运营商、时段和网络环境采样,因为现实网络故障并不独立同分布。
最小知识闭包 6:Forward Proxy 和 Reverse Proxy 为什么名字很像、作用却相反?
前向代理站在客户端一侧,代表用户去访问外部目标;反向代理站在服务端一侧,代表一个服务接住外部用户,再把请求交给内部源站。Clash/mihomo 用在个人电脑上时通常是前向代理;Caddy/Nginx 放在 ai.rest2build.lol 前面时是反向代理。
这两个概念的判别方法不是看软件名字,而是问一句:这个代理是在替谁隐藏/选择下一跳?替客户端选外部目标路径,是 forward proxy;替服务端隐藏和保护内部 origin,是 reverse proxy。同一个软件在不同部署位置甚至可以扮演不同角色。
最小知识闭包 7:为什么“无状态香港节点”仍然需要安全设计?
所谓无状态,主要是说香港节点不保存余额、订单、用户数据库和业务真相;这能让它容易替换、扩容和故障切换。但它仍然终止公网连接,通常能看到来源 IP、Host、请求路径、Header 大小和连接持续时间。如果 TLS 在香港终止,它还会在内存中处理解密后的 HTTP 请求。
因此生产入口仍要做最小日志、Authorization 等敏感 Header 脱敏、系统补丁、速率限制和来源可信链。若需要把真实客户端 IP 传给新加坡,可以使用 X-Forwarded-For / Forwarded 等头,但新加坡只能信任自己控制的香港代理写入这些头,不能盲信公网客户端自带值。
最小知识闭包 8:WireGuard 解决的是哪一类问题?
WireGuard 不会自动让大陆用户到香港更快。它位于香港 → 新加坡这一段,主要价值是给两个你控制的节点建立加密的三层隧道,让源站业务端口可以只在隧道地址上开放,并简化“只允许香港访问新加坡”的网络策略。
如果香港到新加坡公网本身质量已经很好,直接使用双向 TLS + 严格 ACL 也可能满足需求;是否上 WireGuard 应由安全边界、运维复杂度、MTU、故障定位和实际线路表现共同决定。隧道本身也可能因 MTU 不匹配产生“短请求正常、大包或长连接异常”的问题,所以要测真实负载。
最小知识闭包 9:HTTP/2 有帮助,但不是“加速开关”
HTTP/2(Hypertext Transfer Protocol Version 2,超文本传输协议第 2 版)可以在一条连接里多路复用多个请求,并通过头部压缩等机制减少部分开销。它适合入口层,但它不会修复底层跨境路径丢包,也不会替代 SSE/WebSocket 的超时和缓冲配置。
网络工程里要避免“支持了 HTTP/2,所以一定更快”这种单变量推理。真实体验取决于连接复用、TLS、拥塞、请求大小、服务端实现和用户网络;最可靠的方法仍然是端到端测量。
最小知识闭包 10:为什么平均值经常骗你?
假设 99 次请求都是 100 ms,另 1 次超时 10 秒,平均值看起来仍可能“还不错”,但用户会明确感知到失败。因此生产网络更关心分位数和失败率:p50 表示典型体验,p95/p99 暴露长尾,timeout rate 直接反映可用性。
对于 API 中转站,建议把监控按运营商 × 城市/探针 × 时间分桶,再看 p50/p95/p99 和错误类型。否则“全国平均 200 ms”可能掩盖某个运营商晚高峰大量超时。
④ 把真实案例重新还原
把 Sub2API 的真实链路拆开
中国大陆用户 / Codex / Claude Code
│
│ ① DNS:ai.rest2build.lol → 香港入口
▼
香港优化线路接入节点 H
Caddy / Nginx
TLS 终止 · HTTP 转发 · SSE/WebSocket 长连接
│
│ ② WireGuard 或受控公网链路
▼
新加坡 Sub2API 源站 S
鉴权 · 计费 · 渠道调度 · DB / Redis
│
│ ③ 现有 mihomo / egress
▼
GPT / Claude 等上游 U
输入
用户对 https://ai.rest2build.lol 的普通 API、模型流式请求或 WebSocket 请求。
香港节点做什么
接收公网连接、完成 TLS、保留 Host/必要 Header、维持流式连接,然后把请求转到新加坡;不承担账号、余额和订单状态。
新加坡继续做什么
所有真正业务状态仍在 Sub2API:认证、配额、计费、上游选择、数据库与 Redis 不迁移。
香港“无状态”的边界
无状态不等于完全看不到请求。代理在转发时仍会接触连接元数据,若开启 access log 还可能落盘请求信息,因此日志最小化、密钥 Header 脱敏和权限控制仍要做。
第一阶段:单香港入口,先证明方向
ai.rest2build.lol
↓
Hong Kong ingress
↓
Singapore Sub2API
保留一个源站管理域名,例如 origin.ai.rest2build.lol,但它应该面向运维而不是普通客户:可以限制来源 IP、要求 VPN/WireGuard、额外认证,避免用户绕过香港入口直接打源站。
第二阶段:去掉香港单点
Hong Kong ingress A ─┐
├──→ Singapore Sub2API
Hong Kong ingress B ─┘
双节点之后还需要真正的健康切换机制。简单放两个 A 记录只能提供有限的客户端重试机会,并不等于严格的故障转移;更可靠的是带健康检查的 DNS/边缘调度或上层负载入口,同时要观察 DNS TTL 和切换收敛时间。
为什么新加坡安全组要收紧?
一旦香港成为正式入口,新加坡公网源站就不应继续对所有互联网开放相同业务端口。常见做法是:只允许香港节点公网 IP 访问源站 443,或者仅开放 WireGuard 端口、让业务流量走隧道内网地址。这样既减少绕过入口的路径,也降低源站被扫描和直接打流量的暴露面。
⑤ 概念如何映射到现实
代理到底接在哪一侧?
| 方案 | 控制位置 | 实际改变哪段链路 | 能解决什么 | 不能解决什么 |
|---|---|---|---|---|
| 客户端前向代理 / Clash | 每个用户设备 | 用户 → 外部服务 | 单个用户自己的出站路由 | 不能让其他客户自动获得同样线路 |
| 香港反向代理入口 | 服务提供方入口 | 用户 → 香港 → 新加坡 | 统一改善所有用户的入站路径,并保护源站 | 不会自动改善新加坡访问模型上游的 egress |
| 新加坡 mihomo 出站代理 | 业务源站 | 新加坡 → 模型上游 | 改善或控制服务器到上游的访问路径 | 不能修复用户到新加坡之前的连接失败 |
| 边缘网络 / CDN 类产品 | 更大规模的边缘入口 | 用户 → 边缘 → 源站 | 可做分布式接入、TLS、WAF、调度 | 流式长连接、地区线路和产品规则仍需实测 |
Clash 的几个开关为什么容易误解?
| 配置 | 真正含义 | 覆盖范围 | 适合什么 |
|---|---|---|---|
| 仅 Global / 全局模式 | 规定“已经进入 Clash 的流量”统一走某个代理策略 | 不负责保证所有应用流量一定进入 Clash | 已有明确代理入口时,快速强制统一策略 |
| Global + 系统代理 | macOS/Windows 中遵循系统 HTTP/HTTPS/SOCKS 代理设置的应用会进入 Clash,再按 Global 路由 | 某些程序、UDP、QUIC 或自带网络栈的流量可能不遵循系统代理 | 浏览器、常规 HTTP 客户端的快速验证 |
| Rule + TUN | TUN 建立虚拟网络接口,在更底层接管较广范围的 IP 流量,再由规则决定直连或代理 | 覆盖通常比系统代理完整,但仍受操作系统路由、排除项和实现限制 | 希望国内流量直连、目标服务走代理的日常方案 |
| Global + TUN | 大部分被 TUN 接管的流量统一走代理 | 最强制,也最容易让无关国内流量绕行 | 故障定位时临时验证“是否确实是直连链路问题” |
流式 API 的反向代理配置应该关心什么?
| 维度 | 为什么重要 | 故障表现 | 验证方式 |
|---|---|---|---|
| 代理缓冲 | SSE 需要小块数据及时向客户端刷新 | token 很久不出,随后成批出现 | 用持续流式响应观察 chunk 间隔 |
| 读取/空闲超时 | 推理可能持续几十秒甚至更久 | 固定时间后被 502/504 或直接断开 | 运行超过超时阈值的长请求 |
| WebSocket Upgrade | WebSocket 需要从 HTTP 握手升级成长连接 | 普通 HTTP 正常,WebSocket 建连失败 | 实际 Upgrade + 双向消息测试 |
| 请求体与 Header | 模型请求可能带较大上下文和 Authorization | 413、Header 丢失、鉴权失败 | 大请求 + 鉴权 smoke |
| 缓存 | 带用户身份和动态模型输出的 API 不应被共享缓存 | 串响应、错误复用、敏感数据风险 | 检查 Cache-Control 和代理缓存规则 |
选香港节点时到底看什么?
“香港机房”只是地理标签,不能推出大陆访问质量。常见市场标签如 CN2/GIA、CMI、CTGNet、三网优化可以作为筛选线索,但不能替代实测。真正要看的是中国电信、中国联通、中国移动分别到该节点的去程/回程、拥塞和稳定性。
| 指标 | 回答的问题 | 建议观察 |
|---|---|---|
| TCP Connect | 能不能稳定建立连接? | 成功率、p50/p95/p99 建连时间、超时类型 |
| TLS Handshake | HTTPS 握手是否稳定? | 握手时间、证书/SNI 错误、失败率 |
| RTT | 网络往返本身多慢? | 三网、不同城市、不同时段 |
| TTFB | 从请求到首字节总共多慢? | 健康接口与真实模型接口分别测 |
| 流式间隔 | 长连接有没有抖动/缓冲? | SSE chunk gap、长时间停顿、提前关闭 |
| 丢包/重传 | 为什么延迟尖刺? | 持续样本而非一次 ping |
对你这个案例,可以把“大致 15–40 ms 的大陆到香港 RTT、健康接口 50–200 ms 的 TTFB、30 次冷连接无超时、SSE 不缓冲不截断”当作第一阶段工程验收目标,但不要把它们包装成供应商普遍保证。尤其“99.9% 成功率”应该由长时间、多地域、多运营商的监测数据支持,而不是 30 次人工测试。
几个特别容易混淆的边界
| 容易混淆 | 判别维度 | 正确理解 |
|---|---|---|
| Ingress vs Egress | 流量相对服务系统的方向 | 用户进来是 ingress;服务器去模型上游是 egress。 |
| Forward Proxy vs Reverse Proxy | 代理代表客户端还是服务端 | Clash 典型是客户端前向代理;香港 Caddy/Nginx 是服务端反向代理。 |
| RTT vs TTFB | 只看网络往返,还是看完整请求到首字节 | RTT 低不代表应用/上游快;TTFB 高也不一定全是网络。 |
| System Proxy vs TUN | 流量怎样被代理软件接管 | 系统代理依赖应用是否遵循代理设置;TUN 在 IP 层覆盖更广。 |
| Global vs Rule | 流量进入 Clash 后怎样选路 | 它不是“有没有进入 Clash”的开关。 |
| 无状态 vs 无数据暴露 | 是否保存业务真相 | 无状态节点仍会处理经过它的请求和连接元数据。 |
| 双 A 记录 vs 高可用 | 是否有健康感知和故障摘除 | 多个 IP 只是多入口;真正 HA 还要健康检查、切换和演练。 |
一套更可靠的验收分层
L1 · 连得上
三网探针持续测试 TCP 443 和 TLS;记录超时、拒绝连接和握手失败,先证明入口可达。
L2 · 首包快
对稳定的 /health 测 p50/p95/p99 TTFB,把模型推理耗时从网络入口质量里分离出来。
L3 · 流得稳
跑超过正常最长推理时间的 SSE/WebSocket,记录 chunk gap、中断点和固定超时模式。
L4 · 故障能切
主动停掉香港 A,验证调度能否把新连接收敛到 B,并确认旧长连接的失败行为可接受。
L5 · 源站不可绕
从非香港来源访问新加坡业务端口应被拒绝;从香港/WireGuard 应正常。
L6 · 线上可读回
最终从真实公网域名确认 DNS、证书、HTTP、流式接口和版本都对应刚发布配置。
⑥ 现在把它当成一道题
现在假设你得到下面一组持续 7 天的合成监测数据,采样覆盖中国电信/联通/移动三个网络,每条线路各约 1 万次健康请求,同时每天跑长时间 SSE:
| 路径 | Connect 成功率 | p95 TTFB | SSE 1 分钟内异常中断 |
|---|---|---|---|
| 大陆直连新加坡 | 96.8% | 2.6 s | 2.1% |
| 大陆 → 香港 A → 新加坡 | 99.94% | 210 ms | 0.06% |
| 大陆 → 香港 B → 新加坡 | 99.89% | 260 ms | 0.08% |
⑦ 分级提示,最后就是实际答案
Hint 1 · 方向
先问“故障发生在请求图的哪条边上”。如果失败发生在 C → S,改变 S → U 不会改变第一条边。
Hint 2 · 结构
把方案拆成四层:① DNS 把用户送到香港;② 香港做 TLS/反代/长连接;③ 香港到新加坡做受控传输与源站 ACL;④ 新加坡继续做业务和上游 egress。然后再独立设计 A/B 高可用。
Hint 3 · 接近答案
用数据而不是“香港更近”作答:比较 connect success、p95/p99 TTFB、SSE 异常率;客户端 Clash 问题则先区分“流量是否进入 Clash”和“进入后选哪条规则”。
答案 · 实际答案
参考答案:这组数据明显支持把“香港 ingress”作为主修复方向,因为改善发生在用户到服务入口这一段:连接成功率从 96.8% 提升到 99.9% 附近,p95 TTFB 从秒级降到数百毫秒,SSE 中断也显著下降。服务器 egress 仍然可以独立优化,但它不是这组“大陆用户连不上/首包慢”数据的首要解释。
- 第一层:入口位置。让
ai.rest2build.lol指向香港,而不是继续让普通用户直接连接新加坡;香港只做反向代理和接入,不迁移数据库。 - 第二层:长连接。SSE 关闭会聚合响应的代理缓冲,并把 read/idle timeout 调到能够覆盖真实推理时长;WebSocket 必须做实际 Upgrade 和双向消息 smoke。
- 第三层:源站保护。香港到新加坡优先走 WireGuard 或至少使用严格来源 ACL;新加坡业务端口只信任香港入口,管理入口单独保护。
- 第四层:高可用。A/B 两个香港节点都要有独立健康探测和切换策略。双 A 记录并不保证故障节点会被立刻移除,DNS 缓存和客户端重试行为都可能拖慢切换。
- 第五层:观测。同时记录 connect、TLS、TTFB、HTTP 状态、SSE chunk gap、上游耗时和源站处理时间,避免所有问题最后都被叫成“网络慢”。
- 第六层:统计口径。30/30 无失败只能作为 smoke。要讨论 99.9% 级成功率,需要更长时间、更大样本并覆盖三网/城市/时段;还要关注 p95/p99,而不是只看平均数。
对于 Clash 那一问,先检查“流量有没有进入 Clash”。Global/Rule 是进入之后怎么选路;System Proxy/TUN 更接近流量怎样被接管。如果应用没有遵循系统代理,那么把 Clash 从 Rule 切成 Global 也可能没有任何效果;TUN 能在更底层扩大覆盖,但会带来路由、权限和无关流量绕行等代价。