SpacetimeDB:把数据库直接用作服务器

B站影视 港台电影 2025-03-09 16:00 1

摘要:然而,在一些要求快速迭代、部署简单的场景中,客户端-服务端-数据库的构架却可能存在过于臃肿、部署繁琐等问题。SpacetimeDB 作为一个数据库,允许在其内部直接运行应用程序逻辑,从而实现与客户端直连,给出了一个颇具创新性的解决方案。

在主流的 web 服务架构中,数据库一般作为后端服务的下游依赖,承担着数据存储、查询和管理的功能,数据库和 Web 服务往往分开部署,各司其职。

然而,在一些要求快速迭代、部署简单的场景中,客户端-服务端-数据库的构架却可能存在过于臃肿、部署繁琐等问题。SpacetimeDB 作为一个数据库,允许在其内部直接运行应用程序逻辑,从而实现与客户端直连,给出了一个颇具创新性的解决方案。

SpacetimeDB 是一款由 clockworklabs 开发的关系型数据库,代码仓库位于 https://github.com/clockworklabs/SpacetimeDB 。SpacetimeDB 是一个功能完备的关系型数据库系统,允许在数据库内部运行应用程序逻辑,无需再部署单独的 Web 服务器或游戏服务器。SpacetimeDB 支持多种编程语言,包括 C# 和 Rust 等,开发者仍然可以像在传统服务器中一样编写逻辑。

使用 SpacetimeDB 意味着可以使用单一语言编写整个应用程序,并将其作为单个二进制文件进行部署,无需再使用微服务、容器、Kubernetes、Docker、虚拟机、DevOps,也无需再搭建基础设施、进行运维或使用服务器。

使用 SpacetimeDB 的系统,仅需要客户端和 SpacetimeDB,在数据库中存储数据,客户端从其中订阅数据;同时,在 SpacetimeDB 中使用 Module Code 编写逻辑,在客户端中编写客户端逻辑,完成前后端逻辑交互。

SpacetimeDB 还具有以下特色功能:

高性能:能够快速处理大量数据,为应用程序提供高效的数据存储和处理能力。实践中,SpacetimeDB 已经被用作 MMORPG 大型多人在线游戏的后端数据库,能够实时处理游戏中的各种数据,如聊天消息、物品、资源、地形以及玩家位置等,并将处理结果同步到所有客户端。多语言支持:支持多种服务器端和客户端编程语言。服务器端支持 Rust 和实验性的 C#,同时计划支持 Typescript、Python、C++ 和 Lua;客户端支持 Rust、C# 和 Typescript,Python、C++ 和 Lua 也在计划之中,这使得不同技术栈的开发者都能轻松使用。系统表管理:SpacetimeDB 定义了一系列系统表,用于存储数据库的元数据,例如 st_table 表定义了数据库中的表信息,st_column 表定义了表的列信息等,这些系统表的设计有助于对数据库进行有效的管理和维护。

SpacetimeDB 可以被用作代码库,在应用代码中引入来使用,也可以通过 spacetime 命令行工具运行独立的 SpacetimeDB 数据库服务。首先进行安装,在 macOS 上可以直接使用 brew 安装:

brew install clockworklabs/tap/spacetime

对于 Linux 系统,通过 curl 拉取安装脚本并执行:

curl --proto '=https' --tlsv1.2 -sSf https://install.spacetimedb.com | sh

在 Windows 系统中,则使用以下命令安装:

iwr https://windows.spacetimedb.com -useb | iex

SpacetimeDB 的主体是一个 Rust 代码库,所以也可以使用 Cargo 进行安装:

cargo install spacetimedb-cli

对于有特殊需要的开发者,也可以直接从源代码进行安装,要求 Rust 开发环境:

# Install rustup, you can skip this step if you have cargo and the wasm32-unknown-unknown target already installed.curl https://sh.rustup.rs -sSf | sh# Clone SpacetimeDBgit clone https://github.com/clockworklabs/SpacetimeDB# Build and install the CLIcd SpacetimeDBcargo install --path ./crates/cli --locked

安装完成后,使用以下命令启动 SpacetimeDB 服务:

默认使用 3000 端口,可以通过 --listen-addr 参数指定监听地址。

对于服务端逻辑,通过编写 Module 代码完成,以 Rust 语言为例,首先初始化项目结构:

spacetime init --lang rust server

完成初始化后,首先添加表的定义,在 server/src/lib.rs 中,添加一张 User 表:

#[table(name = user, public)]pub struct User { #[primary_key] identity: Identity, name: Option, online: bool,}

然后实现用户名设置逻辑,编写以下代码:

#[reducer]/// Clients invoke this reducer to set their user names.pub fn set_name(ctx: &ReducerContext, name: String) -> Result { let name = validate_name(name)?; if let Some(user) = ctx.db.user.identity.find(ctx.sender) { ctx.db.user.identity.update(User { name: Some(name), ..user }); Ok() } else { Err("Cannot set name for unknown user".to_string) }}

在客户端,以 TypeScript 为例,首先创建一个 React 应用:

pnpm create vite@latest client -- --template react-tscd clientpnpm install

然后编写 App 本体逻辑:

function App { const [newName, setNewName] = useState(''); const [settingName, setSettingName] = useState(false); const [systemMessage, setSystemMessage] = useState(''); const [newMessage, setNewMessage] = useState(''); ...}

SpacetimeDB 作为一款创新性的数据库服务,提供了一种全新的后端解决方案,使得开发者能够更高效地开发和部署应用程序,尤其是在高并发和实时数据场景中,有着一定的优势。

SpacetimeDB 适用于各种类型的 Web 服务和应用程序,特别是需要实时数据处理和同步的场景。例如,在游戏开发中的 MMORPG 游戏,仅需一个小型团队,就能在 SpacetimeDB 完成包括所有玩家和游戏数据的持久化,并可以通过 Module 代码的形式,快速迭代实现所有服务端逻辑。

来源:每日开源代码

相关推荐