7.5 KiB
7.5 KiB
后端重写横向治理规则(2026-04-22)
更新时间:2026-04-22
1. 文档目标
本文件冻结 SpacetimeDB + Axum + OSS 后端重写收口阶段的横向规则,覆盖:
- 前端 TypeScript contract 与 Rust DTO 的映射策略。
- SpacetimeDB table / reducer / procedure 的演进规则。
- 大对象、manifest、workflow cache 的存储边界。
- 阶段文档与 API 索引的维护规则。
这些规则用于减少 M4/M5/M6/M7 后续并行推进时的 contract 漂移。
2. Contract 与前端兼容
2.1 映射原则
packages/shared/src/contracts/*是前端消费 contract 的现有事实来源。server-rs/crates/shared-contracts/src/*.rs是 Rustapi-server返回 DTO 的事实来源。- 两侧字段名必须继续使用当前前端已消费的 JSON 命名,不因 Rust 字段命名风格改变外部 shape。
- Rust DTO 必须通过
serde(rename_all = "camelCase")、显式rename或兼容枚举值保持旧 contract。 - 临时兼容字段只能标记为 optional,不能在没有迁移说明和测试前直接删除。
2.2 当前映射面
| 前端 contract | Rust DTO 模块 | 当前用途 |
|---|---|---|
packages/shared/src/contracts/auth.ts |
shared-contracts::auth |
登录方式、用户信息、会话、审计、验证码与微信登录 |
packages/shared/src/contracts/runtime.ts |
shared-contracts::runtime |
profile dashboard、play stats、wallet ledger、browse history、settings、inventory |
packages/shared/src/contracts/rpgRuntimeStoryAction.ts |
shared-contracts::runtime_story |
runtime story action request / response、state resolve、view model |
packages/shared/src/contracts/rpgRuntimeStoryState.ts |
shared-contracts::runtime_story |
runtime story state / presentation 兼容 |
packages/shared/src/contracts/rpgAgent*.ts |
shared-contracts::runtime 与 custom_world 相关 DTO |
custom world agent session、message、operation、action |
packages/shared/src/contracts/rpgCreation*.ts |
shared-contracts::runtime 与 custom_world 相关 DTO |
result preview、works、library、published profile |
packages/shared/src/contracts/common.ts |
shared-contracts::api |
统一 success / error envelope |
2.3 变更流程
- 扩字段:先加 Rust optional 字段和 contract test,再接前端消费。
- 改字段语义:必须新增技术方案说明旧语义、新语义、迁移期兼容逻辑和回退方式。
- 删字段或删枚举:必须先证明前端调用、Node 兼容层、历史 fixture 和测试都不再消费。
- breaking change 必须在任务清单和设计文档中显式标注,不允许只靠 PR diff 表达。
- 所有 shared contract 变更至少运行
cargo test -p shared-contracts --manifest-path server-rs/Cargo.toml。
3. SpacetimeDB Schema 演进治理
本节按 SpacetimeDB 约束执行:
- reducer 是事务性写入口,不依赖 reducer 返回值读取数据。
- reducer 必须确定性执行,不做网络、文件系统、外部随机数或时间副作用。
- 客户端读取依赖 table / subscription / procedure 返回的显式 DTO,不把 Axum 进程内缓存当真相。
- 用户身份以后续接入 SpacetimeDB 直连时的
ctx.sender()为准,不信任客户端传入 owner 字段。
3.1 命名规则
- table 使用稳定单数 snake_case 名称,例如
story_session、asset_object、custom_world_agent_session。 - reducer 使用动作动词 + 领域对象,例如
upsert_runtime_snapshot、confirm_asset_object、turn_in_quest。 - 需要同步返回 DTO 的 procedure 统一使用
_and_return或get_ / list_ / compile_语义。 - public table 只暴露客户端确实需要订阅或查询的状态;内部审计、token、风控等默认不 public。
- event table 只用于事件广播,不替代持久状态表。
3.2 列演进规则
- 优先追加 optional 字段,不直接改名、改类型或删除列。
- 必须删除语义时,先软废弃字段并让读模型停止依赖,再在独立迁移窗口清理。
- 状态类枚举新增值时,前端必须有 unknown / fallback 处理。
- 需要唯一约束或索引时,先补设计文档说明查询路径,再改 schema。
- 大规模重排表结构必须拆成新表 + 双写 / 读模型迁移,不在原表上做破坏性变更。
3.3 软删除规则
- 用户可见业务实体优先使用
status、deleted_at、archived_at表达生命周期。 - 会话、作品、资产绑定、审计和任务记录默认不物理删除。
- 物理删除只用于临时草稿、过期验证码、过期 OAuth state 等明确可丢弃数据。
- 删除 reducer 必须写清是否幂等,重复调用不能造成不可恢复错误。
4. 大对象与缓存治理
4.1 OSS 存储边界
必须进入 OSS:
- 图片、视频、动作帧、封面图、场景图。
- 大型 JSON manifest。
- 角色工作流缓存 JSON。
- 导入视频和生成过程草稿资源。
只进入 SpacetimeDB 元数据:
bucket、object_key、asset_kind、content_type、content_length、content_hash、version。asset_entity_binding的业务实体、槽位、owner 和 profile 绑定关系。- AI task、asset task、publish gate 等状态字段。
- 可用于列表和权限判断的轻量 summary。
4.2 本地缓存边界
- 生产主链不得把仓库
public/generated-*作为资产真相。 - 旧
/generated-*仅作为同源代理兼容路径,读取私有 OSS 对象。 - 测试环境允许使用
#[cfg(test)]内存兜底,但必须在文档中注明不进入生产链。 - workflow cache 当前真相是 OSS JSON 草稿对象,不落本地文件。
- 临时生成文件如需存在,必须限制在进程临时目录,并在任务完成后清理。
4.3 Manifest 与版本
- 多文件资产集合使用 OSS manifest 表达,不重复新增结构化表,除非已证明查询需求需要。
asset_object.version当前默认1,版本升级必须说明兼容读取规则。content_hash可为空,但一旦用于去重,必须先补冲突处理和重算策略。- 强业务资产表只有在需要领域查询、审核、回滚或权限策略时再新增。
5. 文档维护规则
- 工程修改必须同步对应阶段任务清单。
- 新增或改变接口时,同步更新 RUST_API_SERVER_ROUTE_INDEX_2026-04-22.md。
- 仍存在旧能力差异时,同步更新 CURRENT_BACKEND_IMPLEMENTATION_BASELINE_2026-04-25.md 或新增 Rust 侧补充索引。
- M4 结构变更同步维护 RPG runtime 链路文档。
- M5 结构变更同步维护 creation flow 链路文档。
- M6 资产链路变更同步维护 OSS / asset_object / generated path 文档。
- M7 切流相关变更同步维护部署、预检、smoke 与回滚文档。
6. 验收门禁
横向治理完成不等价于真实切流完成。当前可本地验收的门禁是:
cargo check -p api-server --manifest-path server-rs/Cargo.tomlcargo check -p spacetime-module --manifest-path server-rs/Cargo.tomlcargo test -p shared-contracts --manifest-path server-rs/Cargo.tomlcargo test -p api-server --manifest-path server-rs/Cargo.toml --no-runnode scripts/check-encoding.mjs ...
真实切流前仍必须单独完成:
- OSS 真实读写 smoke。
- LLM / DashScope 真实生成 smoke。
- 关键 SSE 接口联调。
- SpacetimeDB publish / rollback 演练。
- 灰度环境双跑对比。