docs: keep side effects in axum boundary

This commit is contained in:
2026-04-21 00:24:11 +08:00
parent ae4ad46c65
commit fc2e9132a5
3 changed files with 45 additions and 2 deletions

View File

@@ -25,7 +25,8 @@
交付物:[M0_REPOSITORY_BOUNDARY_DECISIONS_2026-04-20.md](./M0_REPOSITORY_BOUNDARY_DECISIONS_2026-04-20.md)
- [x] 确认前端第一阶段仍然只访问 Axum不直连 SpacetimeDB
交付物:[M0_REPOSITORY_BOUNDARY_DECISIONS_2026-04-20.md](./M0_REPOSITORY_BOUNDARY_DECISIONS_2026-04-20.md)
- [ ] 确认外部副作用统一收口在 Axum不放进 SpacetimeDB 模块
- [x] 确认外部副作用统一收口在 Axum不放进 SpacetimeDB 模块
交付物:[M0_REPOSITORY_BOUNDARY_DECISIONS_2026-04-20.md](./M0_REPOSITORY_BOUNDARY_DECISIONS_2026-04-20.md)
### 交付物

View File

@@ -21,7 +21,7 @@
| Rust 后端新目录名与根目录落位方案 | 已确认 | 新 Rust 后端固定为仓库根目录下的 `server-rs/`,与 `server-node/` 同级。 |
| 旧 `server-node/` 在迁移期继续保留,不提前删除 | 已确认 | `server-node/``M0 ~ M6` 期间持续保留,直到 `M7` 切流与回退验证完成后再评估清理。 |
| 前端第一阶段仍然只访问 Axum不直连 SpacetimeDB | 已确认 | `M0 ~ M6` 前端统一只访问 Axum 暴露的 `/api/*``/healthz`、SSE 与静态资源兼容层,不新增直连 SpacetimeDB 原生协议路径。 |
| 外部副作用统一收口在 Axum不放进 SpacetimeDB 模块 | 确认 | 后续补充。 |
| 外部副作用统一收口在 Axum不放进 SpacetimeDB 模块 | 确认 | OSS、LLM、短信、微信 OAuth、本地文件系统等外部副作用统一落在 Axum/application/infra不进入 SpacetimeDB reducer/module。 |
## 3. 已确认决议一:`server-rs/` 固定落在仓库根目录
@@ -156,3 +156,44 @@ Genarrative/
1. `M1 ~ M2` 的 Axum 中间件与鉴权必须先跑通,再谈前端联调。
2. `M3 ~ M6` 新增的 SpacetimeDB reducer/view 先通过 Axum facade 暴露,不直接要求前端改成原生 SpacetimeDB 客户端。
3. 若后续要让前端直连 SpacetimeDB只能作为第二阶段优化事项不能混入当前重写主链。
## 7. 已确认决议四:外部副作用统一收口在 Axum
### 7.1 决议内容
本次重写固定采用以下边界:
1. `SpacetimeDB` 只负责状态、规则、reducer、view、订阅读模型。
2. `Axum/application/infra` 统一负责所有外部副作用。
固定收口到 Axum 的外部副作用包括:
1. 阿里云 OSS 上传、下载、签名、直传凭证
2. DashScope / Ark / 其他 LLM 请求
3. 微信 OAuth
4. 手机验证码短信发送与校验编排
5. 本地文件系统读写
### 7.2 明确不允许放进 SpacetimeDB 的内容
以下能力当前明确禁止进入 `spacetime-module/`
1. 直接发 HTTP 请求给第三方供应商
2. 直接访问 OSS SDK
3. 直接读写本地磁盘
4. 直接处理 Cookie、回调跳转、multipart 上传
5. 直接承担供应商重试、熔断、超时与日志策略
### 7.3 这样决议的原因
1. 这些能力都强依赖 HTTP 头、Cookie、SDK、签名、超时与日志不适合绑进 SpacetimeDB 模块发布周期。
2. 当前前端 contract、鉴权、SSE、静态资源兼容都要求一个稳定的 HTTP 边界层Axum 更适合承担这个角色。
3. 把副作用统一收口到 Axum才能让 SpacetimeDB 保持“状态机真相源”的纯度。
### 7.4 对后续任务的直接约束
从这一条决议开始,后续任务必须遵守:
1. `M1` crate 设计时,`oss-service``llm-service``auth-service` 固定属于 Axum/application 侧。
2. `M2 ~ M6` 设计 reducer 时,只写状态变更,不直接发外部请求。
3. 若确实需要异步副作用,也必须由 Axum worker 或应用层作业执行,再把结果回写 SpacetimeDB。

View File

@@ -75,6 +75,7 @@
- `SpacetimeDB` 负责状态、规则、订阅、命令执行与读模型。
- `Axum` 负责所有外部副作用与 HTTP 协议。
- 在本次重写中,不为 SpacetimeDB module 增加任何外部副作用例外通道。
### 3.2 Axum 的边界