Fronts 2.0
运维与发布

运行时运维

Fronts Host 的可观测性、失败处理、替换、timeout、测试证据与事故关联。

可观测模型

每个 Host 有 hostId,每个应用有 instanceIdtraceId。Host event 包含单调 sequence、timestamp 和当前 snapshot;state event 还带上一状态 duration,error event 带稳定 code 与 phase。每次 resolve、 load、preload、mount、replace 是一个 operation,扩展收到相同且不可变的 operationId、hostId、 traceId、intent、signal,以及存在实例时由 Host 颁发的 identity。

mount/replace 的 resolver 在版本未知前就看到 identity;resolution 后的 context 与 identity 会被冻结 并补充版本。扩展必须用 ID 关联,不能依赖 object identity。Host 快照自己拥有的 ref、context、policy、 resolved envelope 和 container request;opaque source、props、services、signal、DOM target 仍由各领域 所有者管理。动态 container resolver 在 resolution 后、loader 选择前运行并立即快照结果。

公开 phase 是 resolveloadcontainermountreadyupdateactivatedeactivateunmount。replacement 由这些 phase 组成,audit 是同步报告而不是 error phase。MF manifest、entry、 expose、shared 和 resource hook 属于官方 Runtime;在 @fronts/mf load boundary 关联两条 trace, 不要把所有 MF payload 复制到 core。

订阅与指标

const host = createFrontsHost({
  observer(event) {
    telemetry.emit('fronts.lifecycle', event);
  },
  // ...
});
const unsubscribe = host.subscribe((event) => {
  if (event.kind === 'error') reportError(event.error, event);
});

observer 必须非阻塞且不得抛错;通过 buffered client 发出,并移除 props、service argument、带凭证 URL 和敏感 tenant metadata。建议监控 resolution、MF load/preload、mount-to-ready、update/activation、 replacement、active instance、stale cache、capability denial、iframe handshake/RPC timeout/origin rejection、 retained container 与 non-idle audit。instance/trace ID 只放 trace/log,metric 按 app、version、phase、 container、error code 聚合。

失败语义

Fronts 用 FrontsError 包装失败,包含稳定 code、责任 phase、原始 cause 和无需解析 message 的 details。

失败Host 行为
resolution/registry使用已配置 cache/fallback,否则 reject
MF load回滚已取得资源;replacement 当前目标保持活跃
无效协议mount 前拒绝
container preparerevoke service、dispose provider、reject
mount/ready/timeout尽可能 unmount,再 dispose scope/container
update实例仍 mounted,向调用者暴露失败
replacement staging销毁 staging,保留 current
commit 后旧实例 cleanup返回 previousCleanupError,新实例仍 committed
任一不完整 cleanup保留 cleanupError,audit/dispose 失败
observer 抛错runtime 继续,observer 不在事务内

Audit 与关闭

inspect() 返回 live transaction 和因无法证明 cleanup 而保留的 terminal record。audit() 进一步 报告 active instance、cleanup failure、pending operation、replacement transaction、retained owned container 和总体 idle。direct resolve/load/preload 也在 pending 中,并会在 Host dispose 时 abort。

测试、route teardown 和 shell shutdown 后执行:

await host.dispose();
host.assertIdle();

dispose() abort direct operation,abort/unmount instance,等待 replacement 与 late cleanup,再释放 Host 资源。如果 cleanup failure 或 owned container 仍 attached,会以 FRONTS_RUNTIME_LEAK reject; 查看 audit 的 cleanupFailures/retainedContainers 找到 owner。transport-specific object 仍由 composition root 单独 dispose。

替换 runbook 与 timeout

确认新旧 registry response 和不可变 artifact;可预加载候选但不把 preload 当 ready;带稳定 product trace 和全新 resolution context 调 replace;staging 失败时验证旧实例仍活跃;commit 后若有 previousCleanupError,继续服务新实例但按泄漏事故处理;确认 old container 不再 retained;业务验证 失败则回退 registry/channel 后再次 replace,不能原地重写 active artifact。

所有 timeout 必须有限非负,0 只关闭 deadline;生产 readiness 来自实际 SLO,iframe handshake/RPC 保持有限,registry fetch/custom loader 继续传 signal。timeout 必须触发 cleanup,绝不能留下 hidden app。

测试与事故关联

证据分五层:protocol/resolver/service/adapter 单测;Host lifecycle/cancellation/replacement/audit contract; 真实 HTTP remote + 官方 MF Runtime 集成;core-only 与 React/Vue/iframe Chromium E2E;官方及兼容 Vite producer E2E。pnpm test:e2e 测 dev server,pnpm test:e2e:preview 全新构建后测生产产物,CI 使用后者。

事故中同时记录 hostId、operationId/intent、traceId、instanceId、app/version/expose、container type、 registry deployment/policy revision、MF instance/remote/entry 与 Fronts phase/code,便于把所有权定位到 部署策略、MF 资源、producer render、容器或 Host service。

本页目录