ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

TigerBeetle Rust 客户端如何在 Cargo 项目中接入并完成首次转账

2026/9/14 17:10:28 拓冰建站 浏览量
TigerBeetle Rust 客户端如何在 Cargo 项目中接入并完成首次转账 TigerBeetle Rust 客户端如何在 Cargo 项目中接入并完成首次转账【免费下载链接】tigerbeetleThe financial transactions database designed for mission critical safety and performance.项目地址: https://gitcode.com/GitHub_Trending/ti/tigerbeetle这篇文章解决一个具体任务在你的 Rust 项目里引入 TigerBeetle 的 Rust 客户端连接一个本地 TigerBeetle 集群创建两个账户并完成第一笔转账最后核对转账后的账户余额。适用前提来自客户端文档Rust 1.68生产环境仅支持 Linux 5.6macOS 和 Windows 仅作为开发环境支持需要先在本地跑起一个 TigerBeetle 服务器下文用单副本开发集群不提供高可用适合实验。先启动一个本地 TigerBeetle 服务器Rust 客户端本身只是客户端库转账必须先有一个监听中的 TigerBeetle 集群。按 docs/start.md 和根目录 README.md 的 Start 一节在任意工作目录执行以 Linux 为例其他平台的下载地址见 docs/operating/installing.mdcurl -Lo tigerbeetle.zip https://linux.tigerbeetle.com unzip tigerbeetle.zip ./tigerbeetle version第一条命令会从linux.tigerbeetle.com下载 zip 包并解压到当前目录./tigerbeetle version用来确认二进制可执行。接着格式化数据文件并启动副本./tigerbeetle format --cluster0 --replica0 --replica-count1 --development 0_0.tigerbeetle ./tigerbeetle start --addresses3000 --development 0_0.tigerbeetleformat会在当前目录创建数据文件0_0.tigerbeetle一个副本的全部数据都存在这一个文件里--cluster0 --replica0 --replica-count1声明的是单副本拓扑这里的--cluster0要和后面客户端使用的 cluster ID 一致。start让副本在前台持续运行监听 3000 端口等待客户端连接--development是开发模式的标记。这个进程会一直占用当前终端需要再开一个终端跑 Rust 程序。文档说明副本没有优雅停机方式^C直接停止即可只要底层存储正常工作数据是安全的。服务器正常监听 3000 端口后保持它运行进入下一步。在 Cargo 项目中接入 tigerbeetle 包新建一个项目目录并创建Cargo.toml。仓库内 Rust 客户端 README 给出的依赖写法是[package] name tigerbeetle-test version 0.1.0 edition 2024 [dependencies] tigerbeetle.path ../.. futures 0.3tigerbeetle.path ../..是仓库内路径依赖适用于你在 src/clients/rust/ 目录下开发的情况。如果你的项目在这个仓库之外改为依赖 crates.io 上发布的tigerbeetle包包名相同版本以 crates.io 页面为准其余不变。客户端的所有请求都是 async 的需要futures来驱动。官方示例 src/clients/rust/samples/basic/Cargo.toml 用的是futures { version 0.3.31, default-features false, features [executor] }另外客户端的 Cargo.toml 注释明确建议使用 TigerBeetle 的 Rust 应用应在自己项目的 release profile 里开启overflow-checks true因为会计场景下溢出错误后果严重仓库里那行配置只对仓库自身的测试生效最终应用的Cargo.toml需要自行开启。写一个创建账户并转账的 main.rs下面这份代码取自仓库内的 basic 示例 src/clients/rust/samples/basic/src/main.rs可以直接作为src/main.rs使用。它连接 cluster ID 为0的集群创建 ID 为1和2的两个账户从账户 1 向账户 2 转账10然后查回两个账户核对已入账余额use tigerbeetle as tb; fn main() - Result(), Boxdyn std::error::Error { futures::executor::block_on(main_async()) } async fn main_async() - Result(), Boxdyn std::error::Error { let port std::env::var(TB_ADDRESS).unwrap_or_else(|_| 3000.to_string()); let client tb::Client::new(0, port)?; // Create two accounts let account_results client .create_accounts([ tb::Account { id: 1, ledger: 1, code: 1, ..Default::default() }, tb::Account { id: 2, ledger: 1, code: 1, ..Default::default() }, ])? .await?; assert!(account_results.len() 2); assert!(account_results[0].status tb::CreateAccountStatus::Created); assert!(account_results[1].status tb::CreateAccountStatus::Created); let transfer_results client .create_transfers([tb::Transfer { id: 1, debit_account_id: 1, credit_account_id: 2, amount: 10, ledger: 1, code: 1, ..Default::default() }])? .await?; assert!(transfer_results.len() 1); assert!(transfer_results[0].status tb::CreateTransferStatus::Created); // Check the sums for both accounts let accounts client.lookup_accounts([1, 2])?.await?; assert_eq!(accounts.len(), 2); for account in accounts { if account.id 1 { assert_eq!(account.debits_posted, 10); assert_eq!(account.credits_posted, 0); } else if account.id 2 { assert_eq!(account.debits_posted, 0); assert_eq!(account.credits_posted, 10); } else { panic!(Unexpected account); } } Ok(()) }几个参数和代码的对应关系tb::Client::new(0, port)的第一个参数是 cluster ID由启动 TigerBeetle 集群的系统决定上面format时用的是--cluster0所以这里填0第二个参数是副本地址。地址从环境变量TB_ADDRESS读取缺省为3000。README 说明以下写法都合法3000解释为127.0.0.1:3000、127.0.0.1:3000、127.0.0.1解释为127.0.0.1:30013001是默认端口。如果你的服务器没跑在localhost:3000把TB_ADDRESS设为服务器实际地址即可代码本身不用改。客户端是线程安全的多个并发任务应共享同一个实例这样事件才能被自动批量发送多个客户端只在连接多个不同集群时才有必要。运行并验证首次转账在服务器保持运行的前提下于项目目录执行cargo run验证逻辑就写在程序里两次请求的响应状态必须是Created若 ID 已存在则返回Exists失败则返回对应状态码且查回的账户满足账户1debits_posted 10credits_posted 0账户2debits_posted 0credits_posted 10。任何一条 assert 不满足程序会 panic 并打印断言失败位置全部满足时程序正常退出、无输出即完成首次转账。两点限制值得知道客户端会无限重试且不施加单请求超时。如果cargo run长时间挂起不返回先确认 3000 端口的服务器进程还在、TB_ADDRESS与服务器实际地址一致另外关闭客户端会取消在途请求并返回错误但请求仍可能已在服务端被处理文档建议按 reliable transaction submission 用固定 ID 保证重试幂等。这里的单副本集群只用于开发实验生产部署6 副本、高可用见 docs/operating/ 下的部署文档。下一步仓库内还有两阶段转账示例 src/clients/rust/samples/two-phase/ 和批量两阶段转账示例 src/clients/rust/samples/two-phase-many/演示PostPendingTransfer/VoidPendingTransfer的用法账户与转账字段的完整定义见 docs/reference/account.md 和 docs/reference/transfer.mdID 的推荐生成方式见 docs/coding/data-modeling.md。【免费下载链接】tigerbeetleThe financial transactions database designed for mission critical safety and performance.项目地址: https://gitcode.com/GitHub_Trending/ti/tigerbeetle创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考