news 2026/9/14 19:06:04

TigerBeetle Node.js 客户端如何安装并连接本地集群创建第一个账户

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TigerBeetle Node.js 客户端如何安装并连接本地集群创建第一个账户

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:30013001是默认端口。

如果你的集群不在本机 3000 端口,把环境变量TB_ADDRESS设为服务地址即可,上面的代码会自动读取。客户端是线程安全的,建议多个并发任务共享同一个实例,请求会自动批量。

创建第一个账户

TigerBeetle 的账户是一个字段完整的对象,64 位字段用BigInt(JavaScript 中带n后缀的字面量)。下面的main.js完整可运行:创建id1n的账户,检查结果状态,再查询确认它存在。字段结构取自 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 结束);
  • 终端打印出id1n的账户 JSON,字段包括debits_pendingdebits_postedcredits_pendingcredits_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 位整数一律用BigInt1n0n),不要用 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 19:05:05

西安成人学历机构怎么判断正规?2026 年官方核验渠道汇总

直接答案:判断正规与否,不靠听,靠查。五类渠道够用——主体登记信息、教育行政部门、目标院校继续教育学院官网、学籍学历查询、省级教育考试机构。每类渠道回答一个不同的问题,五个问题都清楚了,判断自然成立。一、第…

作者头像 李华
网站建设 2026/9/14 19:03:29

ArmorPaint免费开源PBR贴图工具:从节点材质到游戏引擎全流程实战

如果你做3D资产做到一半,大概率会被贴图这一步卡得头皮发麻。建模再苦,至少每一步都是可控的,但一到上材质、出磨损、做旧化,大家默认就打开Substance Painter——然后就被授权费劝退。ArmorPaint这个名字,是我在一次游…

作者头像 李华
网站建设 2026/9/14 19:02:38

Deepseek技术发展与应用场景探索解析

读研/做科研,最忌讳“囤工具”——下载一堆软件,每款都浅尝辄止,反而浪费时间、拖慢效率。 这篇不贪多,只推荐4款「文献-数据-写作」全流程核心工具,每款都精细化拆解操作步骤、适配场景、避坑细节,甚至补…

作者头像 李华
网站建设 2026/9/14 19:00:28

Python+Django+MySQL从零搭建学生成绩管理系统(含安装教程)

简介:基于Python Django、MySQL与HTML技术栈构建的学生成绩管理系统,是一套面向Web开发初学者、课程设计与毕业设计场景的完整项目,能够帮助学习者快速了解Django项目从结构搭建到功能落地的过程。压缩包共373个文件,大小约2.58MB…

作者头像 李华
网站建设 2026/9/14 19:00:03

OpenClaw 跑 Skills 和 Agent 编排:Key 用 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华