TigerBeetle Node.js 客户端如何安装并连接本地集群创建第一个账户
【免费下载链接】tigerbeetleThe financial transactions database designed for mission critical safety and performance.项目地址: https://gitcode.com/GitHub_Trending/ti/tigerbeetle
本文解决一个具体任务:在本机启动一个单副本 TigerBeetle 集群,安装 Node.js 客户端tigerbeetle-node,用客户端连接到这个本地集群,创建第一个账户并通过查询验证它确实存在。整个过程覆盖 docs/start.md 中"启动单副本集群"的路径和 src/clients/node/README.md 中客户端的安装、建客户端与建账户流程。
适用前提(来自客户端 README 的 Prerequisites):
- Node.js >=
18; - Linux >= 5.6 是 TigerBeetle 唯一支持的生产环境;为了开发方便,macOS 和 Windows 也受支持。
准备一个本地单副本集群
Node.js 客户端只能连接一个已经运行着的 TigerBeetle 集群,所以第一步是先在本机把一个集群跑起来。TigerBeetle 是一个小的静态链接二进制文件,从tigerbeetle.com下载预构建版本(以 Linux 为例,其他平台命令见 docs/start.md 与 docs/operating/installing.md):
curl -Lo tigerbeetle.zip https://linux.tigerbeetle.com && unzip tigerbeetle.zip ./tigerbeetle version然后格式化数据文件。一个副本的全部数据都存放在这一个文件里(这里命名为./0_0.tigerbeetle),--cluster、--replica、--replica-count决定集群拓扑:
./tigerbeetle format --cluster=0 --replica=0 --replica-count=1 --development ./0_0.tigerbeetle接下来启动副本:
./tigerbeetle start --addresses=3000 --development ./0_0.tigerbeetle启动后它在 3000 端口监听客户端连接。文档说明:副本没有优雅关机的方式,可以随时用^C停止,只要底层存储正常工作数据就是安全的。单副本集群不提供高可用,只适合实验,这正是本文要做的场景;--cluster=0和--addresses=3000这两个值后面客户端连接时要保持一致。
安装 tigerbeetle-node 客户端
新建一个项目目录并进入,然后安装客户端:
npm install --save-exact tigerbeetle-node先用一段最小代码确认导入没有问题。创建main.js,写入:
const { createClient, id } = require("tigerbeetle-node"); const process = require("process"); console.log("Import ok!");运行:
node main.js终端输出Import ok!说明客户端库加载成功,可以继续下一步。
创建客户端连接本地集群
客户端用集群 ID 和全部副本的地址创建。集群 ID 和副本地址由启动集群的一方决定,所以这里直接对应前面format/start命令里的--cluster=0和--addresses=3000:
const client = createClient({ cluster_id: 0n, replica_addresses: [process.env.TB_ADDRESS || "3000"], });地址的几种合法写法(来自客户端 README):
3000,解释为127.0.0.1:3000;127.0.0.1:3000;127.0.0.1,解释为127.0.0.1:3001,3001是默认端口。
如果你的集群不在本机 3000 端口,把环境变量TB_ADDRESS设为服务地址即可,上面的代码会自动读取。客户端是线程安全的,建议多个并发任务共享同一个实例,请求会自动批量。
创建第一个账户
TigerBeetle 的账户是一个字段完整的对象,64 位字段用BigInt(JavaScript 中带n后缀的字面量)。下面的main.js完整可运行:创建id为1n的账户,检查结果状态,再查询确认它存在。字段结构取自 src/clients/node/README.md 的账户示例,断言与退出方式取自仓库的 basic 示例:
const assert = require("assert"); const process = require("process"); const { createClient, CreateAccountStatus } = require("tigerbeetle-node"); const client = createClient({ cluster_id: 0n, replica_addresses: [process.env.TB_ADDRESS || "3000"], }); async function main() { const accountResults = await client.createAccounts([ { id: 1n, debits_pending: 0n, debits_posted: 0n, credits_pending: 0n, credits_posted: 0n, user_data_128: 0n, user_data_64: 0n, user_data_32: 0, reserved: 0, ledger: 1, code: 1, flags: 0, timestamp: 0n, }, ]); assert.strictEqual(accountResults[0].status, CreateAccountStatus.created); const accounts = await client.lookupAccounts([1n]); assert.strictEqual(accounts.length, 1); console.log(JSON.stringify(accounts[0], null, 2)); } main().then(() => { process.exit(0); }).catch((e) => { console.error(e); process.exit(1); });createAccounts的返回数组里每一项包含状态码和时间戳,文档定义的三种结果:
- 状态为
created:账户创建成功,返回分配给该账户的时间戳; - 状态为
exists:账户已存在,返回原账户的时间戳; - 其他状态码表示失败,同时带验证发生时的时间戳。
所以脚本先用CreateAccountStatus.created断言创建成功,再用lookupAccounts验证。查询的返回规则是:每个匹配到的 ID 返回对应账户;某个 ID 没有匹配时,响应里就没有该账户的对象,响应顺序也未必和请求顺序一致,需要用响应里的id字段区分。
运行与验证
确认第 1 步的副本仍在 3000 端口运行,然后执行:
node main.js成功的判定:
- 两个断言通过、脚本以
process.exit(0)正常退出(断言失败或连接错误会被catch捕获,打印错误并以退出码 1 结束); - 终端打印出
id为1n的账户 JSON,字段包括debits_pending、debits_posted、credits_pending、credits_posted等,结构同 docs/start.md 中 REPL 查询账户展示的文档示例:
{ "id": "1", "user_data": "0", "ledger": "700", "code": "10", "flags": "", "debits_pending": "0", "debits_posted": "0", "credits_pending": "0", "credits_posted": "0" }(上面是文档中 REPL 路径的示例输出,仅展示字段形态,具体值以你的实际账户字段为准。)
如果你把id改成已存在的 ID 再运行一次,结果会是exists而非新建,这也是判断"客户端已连上正确集群"的直观方式。
边界与限制
- 本地单副本集群只为实验方便,不提供高可用;生产部署是 6 副本集群,见 docs/operating/。
- 客户端会无限重试请求、没有按请求的超时;取消请求的机制是关闭客户端实例,关闭时所有在途请求被取消并返回错误,但请求可能仍会被服务端处理。
- 账户字段里的 64 位整数一律用
BigInt(1n、0n),不要用 JS 的普通Number传 64 位字段值。 - 仓库中还提供了更完整的可运行示例:basic(创建两个账户并做一笔转账)、two-phase、two-phase-many,跑通本文后可以按 src/clients/node/README.md 继续了解转账、批量与查询 API。
【免费下载链接】tigerbeetleThe financial transactions database designed for mission critical safety and performance.项目地址: https://gitcode.com/GitHub_Trending/ti/tigerbeetle
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考