TigerBeetle 深度拆解:一个用 Zig 写的金融级数据库如何让转账吞吐量达到 100 万 TPS——从 VSR 共识到确定性模拟测试的极致工程哲学
引言:当金融交易遇到性能天花板
在分布式系统的江湖里,有一个被反复验证的残酷现实:通用数据库在高并发交易场景下,写入吞吐量存在一个约 100-1000 TPS 的硬上限。
这不是因为硬件不够快,而是因为架构设计本身出了问题。传统 SQL 数据库的交互式事务模型——应用持有锁、在数据库外处理业务逻辑、再写回——在高竞争场景下,网络锁的开销会让性能断崖式下跌。Amdahl 定律告诉我们,即使只有 10% 的竞争度,多线程扩展的收益也会被锁争用吃掉。
2020 年,一个名为 TigerBeetle 的项目悄然出现在 GitHub 上。它的目标极其明确:成为下一代金融交易处理系统的核心引擎,为未来 30 年的 OLTP(在线事务处理)提供支撑。
五年后的今天,TigerBeetle 已经在生产环境中证明了自己的能力:单集群可达 100K-500K TPS,P100 延迟在 100ms 以内,已处理超过 1 万亿笔交易,管理超过 10 亿个账户。更令人惊叹的是,这一切是在一个单线程、无锁、确定性执行的架构上实现的。
TigerBeetle 到底做对了什么?为什么一个用 Zig 语言从零开始构建、没有使用任何外部依赖的数据库,能在性能和安全性上同时碾压传统方案?
本文将从四个核心维度深入拆解 TigerBeetle 的架构设计:
- Debit/Credit 数据模型——为什么复式记账是 OLTP 的最优解
- VSR 共识引擎——如何实现真正的多云高可用
- 极致性能工程——从 io_uring 到单线程设计的每一处优化
- 确定性模拟测试(VOPR)——如何用 1024 核 24/7 模糊测试消灭 bug
一、Debit/Credit:为什么复式记账是 OLTP 的最优数据模型
1.1 从 SQL 到 Debit/Credit 的范式转变
在 TigerBeetle 出现之前,大多数金融系统的做法是:用通用 SQL 数据库 + 应用层业务逻辑来处理交易。一个典型的支付流程可能是这样的:
-- 1. 检查账户余额
SELECT balance FROM accounts WHERE id = 123;
-- 2. 扣减付款方余额
UPDATE accounts SET balance = balance - 100 WHERE id = 123;
-- 3. 增加收款方余额
UPDATE accounts SET balance = balance + 100 WHERE id = 456;
-- 4. 记录交易日志
INSERT INTO transactions (from_id, to_id, amount, created_at) VALUES (123, 456, 100, NOW());
看起来很简单?问题在于:这四个操作不是原子的。在步骤 2 和步骤 3 之间,如果应用崩溃了,钱就凭空消失了。即使加上事务,SQL 的锁机制在高并发下也会成为瓶颈。
TigerBeetle 的做法完全不同——把业务逻辑下沉到数据库内部:
import tigerbeetle
# 创建客户端连接
client = tigerbeetle.Client(cluster_id=0, addresses=["3000"])
# 定义账户
accounts = [
{
"id": 123,
"ledger": 1,
"code": 10, # 用户类型
},
{
"id": 456,
"ledger": 1,
"code": 20, # 商户类型
}
]
# 创建账户
account_errors = client.create_accounts(accounts)
# 执行转账——一个原子操作完成所有事
transfers = [
{
"debit_account_id": 123,
"credit_account_id": 456,
"amount": 100,
"ledger": 1,
"code": 1, # 转账类型
}
]
transfer_errors = client.create_transfers(transfers)
这一个 create_transfers 调用,在数据库内部就完成了:
- 余额检查(借方是否有足够余额)
- 余额更新(借方减少、贷方增加)
- 交易记录(不可变的审计日志)
- ACID 保证(原子性、一致性、隔离性、持久性)
一次查询,8189 笔交易——这就是接口设计带来的性能红利。
1.2 复式记账:600 年的智慧
Debit/Credit(复式记账)不是 TigerBeetle 的发明,它已经有至少 600 年的历史。但 TigerBeetle 做了一件了不起的事情:把这种古老的记账方式用现代分布式系统重新实现。
复式记账的核心原理极其简单:
每一笔交易,都必须有一个借方和一个贷方,且金额相等。钱不会凭空产生,也不会凭空消失。
这个原理在数学上等价于牛顿第三定律:作用力与反作用力大小相等、方向相反。
TigerBeetle 把这个原理内置到了数据模型中:
// TigerBeetle 的 Transfer 结构体(简化版)
const Transfer = extern struct {
id: u128, // 唯一标识(客户端生成)
debit_account_id: u128, // 借方账户
credit_account_id: u128, // 贷方账户
amount: u128, // 金额(整数,避免浮点精度问题)
ledger: u32, // 账本类型
code: u16, // 交易代码
flags: TransferFlags, // 标志位
timestamp: u64, // 时间戳(纳秒精度)
// ... 更多字段
};
每个字段都精心设计:
- id:由客户端生成的 u128,保证端到端幂等性。即使网络重试,同一笔交易也只会被处理一次
- debit_account_id / credit_account_id:强制双入口模型,不可能只扣不加
- amount:u128 整数,彻底避免浮点精度问题(金融系统的大忌)
- 不可变性:交易一旦记录,永远不能被修改或删除。冲正?用另一笔反向交易来实现
1.3 相比 SQL 的三大优势
| 维度 | 传统 SQL | TigerBeetle Debit/Credit |
|---|---|---|
| 原子性 | 需要开发者正确使用事务 | 数据库内置保证 |
| 一致性 | 幂等性、隔离性靠应用层 | 数据库内置严格串行化 |
| 性能 | 跨网络锁 → 高竞争下崩溃 | 无锁、批量处理 → 线性扩展 |
| 审计 | 需要额外的审计表 | 交易不可变,天然审计日志 |
| Schema 迁移 | 新业务 = 新表/新字段 | 统一模型,无需迁移 |
Uber 在 2018 年启动了一个 40 人团队、耗时 2 年的项目,将支付平台迁移到基于复式记账的架构。Airbnb 在 2012-2016 年间经历了 MySQL 管道的崩溃,最终也回到了复式记账。Stripe 内部同样依赖复式记账系统来记录所有支付交易。
历史反复证明:自己造轮子做记账,早晚会回来用复式记账。
二、VSR 共识引擎:真正实现多云高可用
2.1 为什么不是 Raft?
说到分布式共识,大多数人第一反应是 Raft。但 TigerBeetle 选择了另一条路:Viewstamped Replication(VSR)。
这个选择不是偶然的。TigerBeetle 团队对共识算法有极深的理解——他们实现的 VSR 来自 MIT 的论文《Viewstamped Replication Revisited》,并且做了多项创新。
VSR 相比 Raft 的核心优势:
1. 确定性 View Change
Raft 的 leader 选举依赖超时机制,存在"脑裂"风险——两个节点可能同时认为自己是 leader。VSR 通过确定性的 view change 消除了这个风险。
Raft: VSR:
Node A 超时 View Change
→ A 自认为 leader → 所有节点按确定性规则
→ B 也超时 选出新的 primary
→ B 也自认为 leader → 无脑裂风险
→ 脑裂!
2. 多路径消息传递
VSR 使用多条复制路径,即使某条路径出现延迟或故障,数据仍能通过其他路径到达多数派。
3. Flexible Quorums
这是 TigerBeetle 最聪明的设计之一。传统的共识算法要求复制和选举使用相同的多数派(例如 3/5)。TigerBeetle 使用 Heidi Howard 在 2016 年提出的 Flexible Quorums:
- 复制 quorum:3/6(只需 3 个副本确认)
- 选举 quorum:4/6(需要 4 个节点同意才能选出新 leader)
这意味着什么?复制只需 3 个节点,但选举需要 4 个节点。复制延迟更低,同时选举更安全。这是一个双赢的设计。
传统 5 节点:
复制:3/5 → 需要 3 个节点
选举:3/5 → 需要 3 个节点
TigerBeetle 6 节点:
复制:3/6 → 只需 3 个节点(更宽松)
选举:4/6 → 需要 4 个节点(更严格)
2.2 多云部署:真正的生产级高可用
TigerBeetle 推荐的生产部署方案是 6 个副本,跨 3 个云服务商(每个云服务商 2 个副本)。这种部署方式可以:
- 容忍任意一个云服务商完全宕机(6-2=4,仍满足 4/6 选举 quorum)
- 消除供应商锁定(AWS、GCP、Azure 同时使用)
- 满足合规要求(数据主权、地理分布)
- 自动绕过灰色故障(某个副本变慢时自动切换)
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ AWS │ │ GCP │ │ Azure │
│ ┌───┐┌───┐│ │ ┌───┐┌───┐│ │ ┌───┐┌───┐│
│ │ R1││ R2││ │ │ R3││ R4││ │ │ R5││ R6││
│ └───┘└───┘│ │ └───┘└───┘│ │ └───┘└───┘│
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
└──────────────┼──────────────┘
│
VSR 共识层(3/6 复制 + 4/6 选举)
2.3 集群时间:不依赖 NTP 的时钟方案
分布式系统中,时钟同步是一个经典的难题。传统的 NTP 同步存在漂移和跳变,可能导致时间戳不一致。
TigerBeetle 的解决方案:集群时间(Cluster Time)——把所有副本的时钟组合成一个容错的逻辑时钟。
副本 A 时钟: 1000ms
副本 B 时钟: 1003ms ← 略快
副本 C 时钟: 998ms ← 略慢
集群时间 = 容错中值 + 安全边界
= ~1000ms(所有节点一致认可的时间)
这意味着 TigerBeetle 不依赖 NTP,不使用 leader lease,应用只需要处理安全的相对时间(比如交易超时),而不需要依赖绝对时间的精确性。
三、极致性能工程:每一处优化都是为了更快
3.1 为什么选择单线程?
在一个追求极致性能的数据库中,选择单线程设计看似反直觉。但 TigerBeetle 团队有自己的理由:
1. 金融交易的热点账户问题
在真实的支付系统中,少数"热点账户"(比如平台账户、清算账户)会参与大量交易。如果用分片,这些热点账户所在的分片会成为瓶颈,其他分片的扩展能力完全浪费。
2. Amdahl 定律的铁律
单线程算法在低竞争下比多线程更快(避免了锁开销),在高竞争下也不会崩溃(因为根本没有锁)。参见论文 "Scalability! But at what COST?"。
3. 确定性执行
单线程意味着执行顺序完全确定——输入相同,输出必然相同。这为确定性模拟测试(VOPR)奠定了基础。
3.2 批处理:批量越大,单笔越便宜
TigerBeetle 的接口设计天生就是为批量处理优化的。单次查询最多可处理 8189 笔交易,这意味着:
- 共识成本摊销:一次共识复制 = 8189 笔交易
- I/O 批量合并:一次磁盘写入 = 多笔交易
- CPU 缓存友好:紧凑的内存布局让 CPU 缓存命中率极高
单笔处理: 批量处理:
网络往返 1ms 网络往返 1ms
共识复制 2ms 共识复制 2ms
磁盘写入 1ms 磁盘写入 1ms
───────── ─────────
单笔 4ms 8189 笔 4ms
单笔 0.0005ms ← 8000x 提升!
在低负载时,批体会自动变小,用吞吐量换取更低的延迟——这是一个优雅的自适应策略。
3.3 从零开始的全栈优化
TigerBeetle 没有使用任何第三方依赖,从底层到顶层全部自己实现:
语言选择:Zig
Zig 是一种系统级编程语言,与 Rust 类似但更接近 C 的本质。选择 Zig 的原因:
- 无垃圾回收(GC pause 在金融系统中是不可接受的)
- 零成本抽象
- 内存布局完全可控
- 编译期检查,减少运行时错误
内存管理:静态分配
// TigerBeetle 预分配所有内存,永远不会出现 OOM
const arena = ArenaAllocator.init(.{
.total_memory = config.storage_size_max,
});
所有内存在启动时一次性分配完毕。没有 malloc/free 的运行时开销,没有内存碎片,没有 GC 停顿。
I/O 模型:io_uring
TigerBeetle 专为 Linux 的 io_uring 设计。io_uring 是 Linux 5.1 引入的异步 I/O 接口,相比 epoll 有巨大优势:
| 特性 | epoll | io_uring |
|---|---|---|
| 系统调用次数 | 每次 I/O 一次 | 批量提交,零系统调用 |
| 上下文切换 | 频繁 | 极少 |
| 内存拷贝 | 多次 | 共享内存 |
| 性能 | 好 | 极好 |
epoll 模型:
用户态 → 系统调用 → 内核态 → 完成通知 → 用户态
每次 I/O 都有一次完整的上下文切换
io_uring 模型:
用户态 → 提交队列(共享内存)→ 内核批量处理
→ 完成队列(共享内存)→ 用户态
批量提交,零系统调用
数据结构:Cache-Line 对齐
// Transfer 对象精确设计为 128 字节,刚好是两条 CPU cache line
const Transfer = extern struct { // 128 bytes
// ... 字段定义 ...
};
// 执行一批 Transfer 就是一个紧凑的 CPU 循环
3.4 单线程的极致:零拷贝、零反序列化
由于所有数据结构都是固定大小的(Account、Transfer),TigerBeetle 可以做到:
- 零拷贝:数据在内存中连续存储,直接指针操作
- 零反序列化:固定布局的结构体可以直接内存映射
- Direct I/O:绕过操作系统的 Page Cache,直接与磁盘交互
传统数据库:
磁盘 → Page Cache → 反序列化 → 应用逻辑 → 序列化 → Page Cache → 磁盘
TigerBeetle:
磁盘 → Direct I/O → 固定布局结构体 → CPU 循环处理 → Direct I/O → 磁盘
(无 Page Cache,无序列化/反序列化)
四、确定性模拟测试(VOPR):让 bug 无处藏身
4.1 为什么单元测试和集成测试不够?
传统的测试方法在分布式系统中面临一个根本性问题:不确定性。
网络消息的到达顺序是不确定的,磁盘 I/O 的完成顺序是不确定的,线程调度是不确定的。这意味着:
- 同一个 bug 可能 1000 次测试只复现 1 次
- 无法保证修复一个 bug 不引入新的 bug
- 边界条件几乎不可能被测试覆盖
4.2 VOPR:数据库领域的"飞行模拟器"
TigerBeetle 的解决方案是 VOPR——Viewstamped Operation Replicator,一个确定性模拟器。
VOPR 的灵感来自三个来源:
- 电影《WarGames》(战争游戏)
- Dropbox 的 Nucleus 测试系统
- FoundationDB 的确定性模拟测试
核心思想:用伪随机数替代真实世界的不确定性,让整个系统的行为完全可重现。
真实世界: VOPR 模拟:
随机网络延迟 → 伪随机种子决定延迟
随机磁盘故障 → 伪随机种子决定故障
随机 CPU 调度 → 确定性执行顺序
──────── ────────
不可重现 完全可重现
4.3 VOPR 的工作原理
VOPR 模拟一个完整的 TigerBeetle 集群(通常 6 个副本),在虚拟的"世界"中运行:
确定性执行:所有代码的执行顺序由伪随机数生成器(PRNG)决定,相同的种子 → 相同的执行轨迹
故障注入:在每个时间步,VOPR 可以注入各种故障:
- 网络分区(某些节点之间断开)
- 消息延迟(某些消息故意延迟到达)
- 节点崩溃(某些节点突然停止响应)
- 磁盘故障(模拟数据损坏)
1000x 加速:VOPR 以 1000 倍的速度运行模拟,相当于在几小时内测试完现实世界几个月的运行情况
断言检查:每一步都执行数以千计的断言,检查不变量是否被违反
# 运行 VOPR 模拟测试
scripts/vopr.sh
# VOPR 会输出类似这样的日志:
# VOPR: tick 1,234,567 — injecting network partition between replica 2 and 4
# VOPR: tick 1,234,568 — replica 4 detected as slow, rerouting replication
# VOPR: tick 1,234,569 — 3/6 quorum maintained, no data loss
# ... 数百万步后,如果没有触发任何断言,测试通过
4.4 70K+ 视角:实时观看 VOPR 运行
TigerBeetle 提供了一个可视化工具,让你实时观看 VOPR 的运行过程:
- 实时时间 vs 模拟时间的比例约为 1:700
- 你可以看到网络分区如何被自动恢复
- 你可以看到灰色故障(slow node)如何被自动绕过
- 你可以看到数据如何在副本之间保持一致
这是一个真正的"飞行模拟器"——让工程师能在安全的环境中测试最极端的故障场景。
4.5 Jepsen 认证:经受住了最严苛的测试
TigerBeetle 是第一个通过 Jepsen "螺旋故障"(helical fault)注入测试的数据库。Jepsen 的测试方式是:在所有机器上同时注入随机位翻转,模拟宇宙射线导致的比特翻转。
Jepsen 的测试结论:
"TigerBeetle 对磁盘故障表现出非凡的韧性。在我们的测试中,它从位翻转和其他文件损坏中恢复了过来,几乎覆盖了节点数据文件的每个部分——只要损坏仅限于少数节点。在 grid 等文件区域中,TigerBeetle 甚至能容忍所有副本中除一个以外的所有数据丢失或损坏。"
4.6 TigerStyle:安全关键代码的工程规范
TigerBeetle 的代码风格被称为 TigerStyle,灵感来自 NASA 的《Power of 10》安全关键代码规范:
- 静态内存分配:消除内存泄漏、OOM、use-after-free
- 6000+ 断言:在代码中设置数千个"绊线",任何违反不变量的行为都会被立即捕获
- 无隐藏控制流:避免 switch-case 中的隐式 fallthrough
- 最小接口面:暴露给用户的 API 尽可能小,减少误用可能
// TigerStyle 示例:使用 assert 检查不变量
fn process_transfer(self: *StateMachine, transfer: Transfer) void {
// 断言:转账金额不能为零
assert(transfer.amount > 0);
// 断言:借方和贷方账户不能相同
assert(transfer.debit_account_id != transfer.credit_account_id);
// 断言:账户余额不能为负
assert(self.get_balance(transfer.debit_account_id) >= transfer.amount);
// 执行转账...
}
五、性能基准对比:与传统方案的真实差距
5.1 TigerBeetle vs PostgreSQL
在 OLTP 场景下,TigerBeetle 和 PostgreSQL 的差距是数量级的:
| 指标 | PostgreSQL | TigerBeetle | 差距 |
|---|---|---|---|
| TPS(单节点) | 1,000-5,000 | 100,000-500,000 | 100-500x |
| P100 延迟 | 10-100ms | < 100ms | 稳定 |
| 竞争下的扩展 | 急剧下降 | 线性 | - |
| 审计能力 | 需要额外设计 | 内置不可变日志 | - |
5.2 TigerBeetle vs Redis
Redis 虽然快,但它不是为交易处理设计的:
| 指标 | Redis | TigerBeetle |
|---|---|---|
| 数据安全 | 可配置持久化(有风险) | 强制持久化(WAL 复制) |
| 事务语义 | MULTI/EXEC(非严格 ACID) | 严格串行化 |
| 分布式一致性 | 主从复制(可能丢失数据) | VSR 共识(零数据丢失) |
| 审计 | 不支持 | 内置不可变日志 |
5.3 TigerBeetle vs FoundationDB
FoundationDB 也是一个优秀的分布式数据库,但设计目标不同:
| 维度 | FoundationDB | TigerBeetle |
|---|---|---|
| 设计目标 | 通用事务型 KV | 专用 OLTP 交易引擎 |
| 数据模型 | Key-Value | Debit/Credit |
| 语言 | C++ / Rust | Zig |
| 测试方法 | 模拟测试 | 模拟测试(VOPR) |
| 性能 | 优秀 | 1000x 更快(在 OLTP 场景) |
六、实际应用场景与集成指南
6.1 典型应用场景
TigerBeetle 特别适合以下场景:
1. 支付系统
- 实时支付清算
- 跨境支付
- 数字钱包
2. 金融交易平台
- 证券交易
- 期货/期权交易
- 加密货币交易所
3. 游戏经济系统
- 游戏内货币流通
- 虚拟物品交易
- 跨服交易
4. 能源交易
- 电力现货交易
- 碳排放权交易
- 实时计费
6.2 Python 客户端集成示例
import tigerbeetle
# 连接到 TigerBeetle 集群
client = tigerbeetle.Client(
cluster_id=0,
addresses=["127.0.0.1:3000"]
)
# 1. 创建账户
accounts = [
{
"id": 1, # 用户 A 的账户
"ledger": 1, # 美元账本
"code": 10, # 个人用户
},
{
"id": 2, # 用户 B 的账户
"ledger": 1,
"code": 10,
},
{
"id": 3, # 平台手续费账户
"ledger": 1,
"code": 20, # 系统账户
}
]
errors = client.create_accounts(accounts)
if errors:
print(f"创建账户失败: {errors}")
# 2. 执行转账(带手续费)
transfers = [
{
"debit_account_id": 1, # 用户 A 付款
"credit_account_id": 2, # 用户 B 收款
"amount": 950, # 实际到账金额(分)
"ledger": 1,
"code": 1, # 普通转账
},
{
"debit_account_id": 1, # 用户 A 付手续费
"credit_account_id": 3, # 平台收取手续费
"amount": 50, # 手续费(分)
"ledger": 1,
"code": 2, # 手续费
}
]
errors = client.create_transfers(transfers)
if errors:
print(f"转账失败: {errors}")
# 3. 查询账户余额
balances = client.get_account_balances(account_id=1)
print(f"用户 A 余额: {balances}")
# 4. 查询交易历史
transfers = client.get_account_transfers(
account_id=1,
limit=10,
flags={"credit": True, "debit": True}
)
for t in transfers:
print(f"交易 {t.id}: 金额 {t.amount}")
6.3 部署建议
# 1. 下载 TigerBeetle
curl -Lo tigerbeetle.zip https://linux.tigerbeetle.com
unzip tigerbeetle.zip
# 2. 格式化数据文件(首次运行)
./tigerbeetle format --cluster=0 --replica=0 --addresses="127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" 0_0.tigerbeetle
# 3. 启动 3 节点集群
./tigerbeetle start --addresses="127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" 0_0.tigerbeetle
# 4. 运行基准测试
./tigerbeetle benchmark
七、TigerBeetle 的局限性与适用边界
没有任何技术是万能的。TigerBeetle 的设计决定了它适合 OLTP,但不适合:
不适合的场景:
- 复杂查询:TigerBeetle 没有 SQL,不能做 JOIN、GROUP BY 等分析查询
- 全文搜索:不是搜索引擎的替代品
- 高频读取:写优化设计,读取性能不是重点
- 小规模项目:如果你只需要简单的 KV 存储,Redis 更合适
适合的场景:
- 金融级交易处理(支付、清算、结算)
- 高竞争写入场景(热点账户、实时交易)
- 需要强一致性审计的系统
- 需要零数据丢失保证的系统
与 OLAP 系统的搭配
TigerBeetle 官方推荐的架构是 OLTP + OLAP 分离:
┌──────────────────────────────────────────┐
│ 应用层 │
│ │
│ 写入路径: 读取路径: │
│ App → TigerBeetle TigerBeetle → OLAP │
│ (OLTP) (分析查询) │
└──────────────────────────────────────────┘
写入最后到 TigerBeetle(保证强一致性),读取先从 OLAP 系统(保证性能)。这种分离是金融系统的最佳实践。
八、总结与展望
TigerBeetle 的成功证明了一个道理:在正确的领域,专用设计可以碾压通用方案。
它没有试图成为一个"万能数据库",而是专注于一件事:把金融交易处理做到极致。
核心创新总结:
| 创新点 | 影响 |
|---|---|
| Debit/Credit 数据模型 | 600 年的智慧 + 现代分布式系统 = 零错误的交易处理 |
| VSR 共识 + Flexible Quorums | 真正的多云高可用,无脑裂风险 |
| 单线程 + 批处理 | 消除锁争用,1000x 性能提升 |
| io_uring + Direct I/O | 零系统调用的极致 I/O |
| 静态内存分配 | 零 OOM、零碎片、零 GC 停顿 |
| VOPR 确定性模拟 | 1024 核 24/7 模糊测试,消灭 bug |
| TigerStyle 工程规范 | NASA 级别的安全关键代码标准 |
TigerBeetle 给我们的启示是:不要试图用通用工具解决专用问题。当你面对的是金融交易这种对正确性和性能都有极端要求的场景时,从第一性原理出发、用正确的语言(Zig)、正确的模型(Debit/Credit)、正确的测试方法(确定性模拟),才是正道。
未来,随着实时支付、数字货币、能源交易等场景的爆发,TigerBeetle 这类专用交易引擎的价值只会越来越大。它不只是一个数据库,更是一种工程哲学的体现——安全和性能不是对立的,而是可以同时达到极致的。
参考资源:
- TigerBeetle 官方文档:https://docs.tigerbeetle.com
- TigerBeetle GitHub:https://github.com/tigerbeetle/tigerbeetle
- TigerStyle 规范:https://tigerstyle.dev
- VOPR 在线模拟器:https://sim.tigerbeetle.com
- Jepsen 测试报告:https://github.com/jepsen-io/jepsen
- Viewstamped Replication 论文:https://dspace.mit.edu/handle/1721.1/71763
- "Scalability! But at what COST?" 论文:https://www.usenix.org/system/files/conference/hotos15/hotos15-paper-mcsherry.pdf