架构与模块
单体平台、供应与产品边界、鉴权及持久恢复路径
部署边界
首期一个 Go 服务,Gin 路由、GORM 数据访问,PostgreSQL 保存权威数据,Redis 用于非权威缓存与限流。Console/Admin 两个 React 前端构建为静态资源,与服务一起发布。恢复任务先由同一服务执行;是否拆为独立 Worker 在容量验证后决定,操作状态和接管依据必须先持久化。
图片/音频供应入口待审计,不用此图推导它们已经可用。文本现有企业客户不迁入平台;平台销售价与网关采购价分别管理。
模块边界
| 模块 | 责任 | 禁止跨越的边界 |
|---|---|---|
| identity / authorization | 用户、会话、角色、Key 和受限产品授权 | 不信任 Body/Header 的用户与角色声明 |
| pricing | 模型销售目录、客户方案、报价与版本快照 | 不以供应采购价临时覆盖客户价 |
| accounting | 用户余额、冻结、账务操作、流水和退款 | 不建立产品钱包或 quota 同步副本 |
| relay | 协议解析、上游调用、用量、平台客户模型任务 | 不直连供应商,不保存产品 Project |
| payment | 人民币订单、可信通知、核对与一次入账 | 浏览器返回不代表支付成功 |
| administration | 管理操作、细分权限、审计与异常核对 | 产品管理接口仍由产品实现 |
| recovery | 原任务查询、账务重试、租约接管和待核对 | 不因超时自动重做付费生成 |
以上是职责划分,不要求初始源码目录立即改成同名包。控制器负责请求解析/响应,服务负责授权后的业务流程,资金状态与流水由统一记账服务事务提交;Relay 不能绕过它写余额,Admin 也不能直接改余额列。
三条关键路径
模型调用:验证 Key 或用户委托 → 检查模型权限与价格 → 持久预留及价格快照 → 记录执行状态 → 通过 uumi/媒体网关执行 → 保存确认用量/任务结果 → 原操作结算 → 可查询使用记录。同步模型的预扣/执行如何映射操作状态必须基线审计,不能只给非模型新接口补事务。
非模型收费:验证用户会话与产品凭据 → 预留 → 通过原子状态变化确认开始 → 产品执行 → 按实际数量结算或确认未执行/明确失败后释放。产品扩大范围前先补充预留;开始回执丢失先查询,不能认为未开始。
后台恢复:扫描到期租约和持久待处理记录 → 接管原操作 → 查询原上游任务/订单 → 按原价格及归属登记事实 → 幂等结算/释放/退款 → 更新核对状态与审计。授权退出后,已发生的任务仍须正确处理;不会授予新执行权限。
故障边界
数据库是身份、授权操作和账务权威。Redis 缓存不可用不能造成资金丢失或越权;限流降级策略需明确,数据库不可用时拒绝新付费操作。外部请求不在持有用户资金行锁的长事务中执行;提交前后状态与未知结果按数据与状态恢复。
服务只通过受控接口互通,不让产品直接读写平台库,不把平台会话密钥或供应 Key 发给产品浏览器。身份和文件访问规则分别见身份及共用任务与媒体。