#共识 #协议 #复制 #非确定性 #请求 #单个 #客户端

视图戳复制

基于 Rust 的视图戳复制共识协议实现

8 个重大版本发布

0.9.0 2024 年 3 月 10 日
0.7.0 2024 年 2 月 12 日

#663网络编程

Download history 13/week @ 2024-04-14 107/week @ 2024-04-21 13/week @ 2024-06-30 49/week @ 2024-07-07

每月 62 次下载

Apache-2.0

72KB
2K SLoC

视图戳复制

基于 Rust 的视图戳复制共识协议实现。

并发

基本协议假设每个客户端只有一个并发请求。客户端应用程序可以通过为单个客户端应用程序实例使用多个客户端标识符来实现更高的并发性。

非确定性

通过从主节点查询预测值并将该值传递到所有副本的 prepare 阶段来支持非确定性。目前,不支持文献中提到的其他解决方案,例如发送预测消息,等待 f 响应并确定性地合并值。

日志压缩

通过定期将服务状态保存为检查点来支持日志压缩。服务必须可以从检查点恢复。一旦存在足够大的检查点后缀,日志可以压缩以删除后缀之前包含在最后一个检查点中的所有操作。

例如,想象一个每 5 分钟进行一次检查点的配置,并保留最后 3 个检查点。日志将在第 4 个检查点进行压缩,并且任何在第一个检查点中反映应用程序状态的操作将从日志中删除。

模拟

示例中包含使用异步任务和通道模拟协议的功能。

cargo run --example simulation

状态迁移

  • 协议没有说明当副本接收到比其日志中的操作更新的 GetState 消息时要做什么。目前,我们丢弃该消息。

待办事项

  • 定义机制,以便在接收到协议消息时从配置中恢复副本。
  • 支持非确定性的可选预步骤,该步骤从 f 备份中获取预测。
  • 支持在备份上的陈旧只读请求。
  • 支持配置更改。
  • 支持网络通信。
  • 支持在恢复时从其他副本获取检查点。
  • 支持在日志压缩中实现写时复制语义以降低检查点的成本。
  • 使非确定性和检查点对于服务实现是可选的。
  • 驱逐客户端表以限制内存使用。

依赖项

~1–1.7MB
~34K SLoC