SuperAPI AI 工具集

concepts

通用与其它

查看项目

更新于 10-15 19:50

技能介绍

用途:帮助理解 SpacetimeDB 架构与核心概念,适合学习该数据库或做架构决策时参考。

主要能力与概念:SpacetimeDB 是同时充当服务器的关系型数据库,可将应用逻辑以模块形式直接上传到数据库,省去传统 Web/游戏服务器层。Rust、C#、C++ 模块编译为 WebAssembly,TypeScript 模块运行在 V8 上。

关键规则:Reducer 是事务性的,不向调用方返回数据,读取数据应通过订阅;Reducer 必须确定性,不得使用文件系统、网络、外部时钟或外部随机源,应使用 reducer 上下文(ctx)提供的确定性时间戳与随机值;自增 ID 不连续,存在间隙属正常,不可用于排序,应使用时间戳或显式序列列;ctx.sender 是已认证主体,不可信任作为参数传入的身份。

功能实现清单:后端定义表存储数据、定义 Reducer 修改数据;客户端订阅表、从 UI 调用 Reducer、渲染表中数据。

调试清单:SpacetimeDB 服务是否运行(spacetime start)、模块是否发布(spacetime publish)、客户端绑定是否生成(spacetime generate)、查看服务日志(spacetime logs <db-name>)、Reducer 是否真的被客户端调用。

表:默认私有,仅 Reducer 与数据库所有者可访问;公开表可供客户端通过订阅读取,写入仍需 Reducer。应按访问模式而非实体组织数据。

Reducer:事务性函数,原子运行,不能与外部世界交互,不返回数据。事件表向客户端广播 Reducer 特定数据,行不存入客户端缓存(count() 返回 0,iter() 无产出),仅触发 onInsert 回调。

订阅:实时复制数据库行到客户端,流程为注册 SQL 查询、接收初始数据、接收实时更新、通过回调(onInsert、onDelete、onUpdate)响应变化。最佳实践:按生命周期分组订阅、更新订阅时先订阅再取消、避免重叠查询、为高效查询使用索引。

模块:包含在数据库内运行的应用逻辑,含表、Reducer、事件表、视图(只读函数,向客户端暴露计算子集)、过程(不稳定,可有副作用如 HTTP 请求、ctx.withTx)。服务端模块可用 Rust、C#、TypeScript、C++ 编写。生命周期:编写→编译→发布(spacetime publish)→热替换(重新发布而不断开客户端)。

身份:Identity 是长期全局唯一用户标识,ConnectionId 标识特定客户端连接,授权始终使用 ctx.sender / ctx.Sender / ctx.sender()。支持多种 OIDC 提供方,包括内置 SpacetimeAuth、Auth0、Clerk、Keycloak、Google、GitHub。

限制:过程功能标注为不稳定;具体语法见各语言服务端技能文档,本文未提供。