4.8 KiB
4.8 KiB
卡顿与首次创建失败检查
范围:本地 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、公网传输、边缘入口与后端响应;这次未在边缘入口加分段追踪,不能把它进一步精确归因给某一个网络跳点。直连与代理样本都有波动,目前不支持简单添加代理规则即可解决的结论。
代码中的等待与失败点
- 登录回调先兑换会话,再导航到 dashboard;dashboard 原来依次获取 profile、workspaces,最后再请求首个空间的画布。资料与空间没有数据依赖,原来的串行等待是多余的。
- 初次进入的账号可能没有 workspace。原来的创建画布分支直接抛出 workspace_required,错误映射又没有这个编码,所以截图只显示“操作未完成,请稍后重试”。没有发出创建画布 HTTP 请求。
- 切换空间时没有取消旧读取;旧列表还可能在创建完成后返回,从而覆盖刚添加的画布。
- 画布读取期间显示空状态,Google 跳转时缺乏忙碌提示,会把真实等待和“操作没有生效”混在一起。
- 全局 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 保留;刷新页面即可载入新代码。
- 首次画布的完整浏览器回归使用本机模拟后端;没有替用户创建线上测试画布。
后续真实账号验收已完成:创建「个人空间」和「周末的灵感」后,完整刷新页面仍能读取画布。此前的隔离测试限制已由此项验收补齐,详情见 VALIDATION.md。
