Files
Endoleap/PERFORMANCE.md
T

64 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 卡顿与首次创建失败检查
范围:本地 Next.js 前端、Foundry 代理、线上只读健康检查与现有 Go 代码。没有读取浏览器会话令牌,也没有向用户的线上账号写测试数据。
## 结论与证据
主要等待位于本地前端到公网 API 的请求链路;原来的前端串行加载进一步累加了这部分延迟。尚无证据表明页面绘制或某条业务 SQL 是这次秒级等待的主要来源。下面的采样数量有限,不是负载测试,也不能代替真实授权请求的逐段追踪。
| 测量位置 | 本次样本 |
| --- | --- |
| 本地 /login HTTP 完整响应,3 次 | 1.6、1.8、7.0 ms |
| 本地代理调用未登录 /profile,修改前,3 次 | 473、686、1262 ms |
| 公网 /healthz,直连、新连接,3 次 | 1.38、2.71、4.09 s |
| 公网 /healthz,经当前 Clash 代理,3 次 | 1.19、2.65、3.28 s |
| 服务器容器内 /readyz,5 次 | 10–81 ms |
| 服务器访问 Google token URL(无有效 code),3 次 | 52、74、309 ms |
| 服务器访问 Google userinfo(无会话),3 次 | 55、60、112 ms |
本地代理新增 Server-Timing 后,再测同一条未登录 /profile:
| 样本 | 等待上游响应头 | 代理总耗时 | 总耗时减去上游等待 |
| --- | --- | --- | --- |
| 1 | 5196.4 ms | 5198.3 ms | 1.9 ms |
| 2 | 614.6 ms | 615.0 ms | 0.4 ms |
| 3 | 1080.6 ms | 1081.5 ms | 0.9 ms |
这条未登录请求在后端会话格式校验时就返回 401,不需要业务 SQL。上游耗时包含 DNS、连接/TLS、公网传输、边缘入口与后端响应;这次未在边缘入口加分段追踪,不能把它进一步精确归因给某一个网络跳点。直连与代理样本都有波动,目前不支持简单添加代理规则即可解决的结论。
## 代码中的等待与失败点
1. 登录回调先兑换会话,再导航到 dashboard;dashboard 原来依次获取 profile、workspaces,最后再请求首个空间的画布。资料与空间没有数据依赖,原来的串行等待是多余的。
2. 初次进入的账号可能没有 workspace。原来的创建画布分支直接抛出 workspace_required,错误映射又没有这个编码,所以截图只显示“操作未完成,请稍后重试”。没有发出创建画布 HTTP 请求。
3. 切换空间时没有取消旧读取;旧列表还可能在创建完成后返回,从而覆盖刚添加的画布。
4. 画布读取期间显示空状态,Google 跳转时缺乏忙碌提示,会把真实等待和“操作没有生效”混在一起。
5. 全局 h2 样式覆盖 DialogTitle 的字体工具类,导致截图中的弹窗标题异常偏大。
## 本地已修改
- src/lib/workspace.ts:并行加载资料和空间;创建首张画布前建立默认个人空间,空间创建成功后立即保留其 ID,避免画布失败重试时重复创建空间。
- src/pages/dashboard.tsx:接入上述流程;取消过期读取,防止旧列表覆盖新画布,增加画布加载状态;读取空间失败时禁止误判为“尚无空间”;限定弹窗标题样式。
- src/lib/api.ts:补充空间、物料与超时的明确错误提示。
- src/pages/api/foundry/[...path].ts:增加仅含耗时数字的 Server-Timing;取消已断开的上游读取;明确区分超时,保持 HttpOnly 会话处理。
- src/pages/login.tsx:Google / Slack 跳转提供忙碌状态,避免重复点击。
- src/styles/globals.css:明确限定弹窗标题、描述字体大小。
- tests/workspace.test.mjs:覆盖读取并行、首张画布、创建失败后的重试、已有空间直接创建。
- tests/api-smoke.mjs:保留会话安全检查并验证耗时标记。
没有修改后端业务源码、路由安全策略或线上数据。公网链路延迟仍待进一步追踪;本轮没有把它宣称为已解决。
## 验证
- 最终 npm run build 成功,包含 TypeScript 检查。
- 4 项 workspace 流程回归全部成功。
- API 会话、跨站拒绝、白名单与耗时标记 smoke 通过。
- 隔离浏览器验收:空账号直接点击新建,创建“个人空间”和“周末的灵感”成功。模拟旧画布列表延迟 650 ms,新建响应 100 ms,画布仍保持可见,没有被旧列表覆盖。
- 隔离后端记录 profile 与 workspaces 在相隔 2 ms 时发起,确认已并行。
- 本地生产预览已重启到 http://localhost:17321。原有登录 Cookie 保留;刷新页面即可载入新代码。
- 首次画布的完整浏览器回归使用本机模拟后端;没有替用户创建线上测试画布。
![首次创建回归(本机隔离数据)](/Users/zzyang/Documents/Codex/2026-11-05/foundry-core-codex-integration/outputs/foundry-first-board-check.jpg)
后续真实账号验收已完成:创建「个人空间」和「周末的灵感」后,完整刷新页面仍能读取画布。此前的隔离测试限制已由此项验收补齐,详情见 VALIDATION.md。