返回资讯中心
外部精选
软件工程
#开发者实时流

Octopii 发布用 Rust 编写的分布式系统内核

来源标题:Distributed Systems Kernel written in Rust

Octopii 是一个用 Rust 编写的分布式系统内核,为构建可复制、抗崩溃的服务提供基础原语。它对时间、存储、网络和随机性进行抽象,同时支持生产部署和确定性测试;内置基于 OpenRaft 的 Raft 共识、自研 WAL、QUIC 传输以及崩溃恢复验证。

Hacker News 最新znano2026/11/7 · 8 天前10 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

Octopii 是一个分布式系统内核,为构建可复制、抗崩溃的服务提供基础原语。与那些将库拼接在一起的典型框架不同,Octopii 对时间、存储、网络和随机性进行了抽象,从而既支持生产部署,也支持严格的确定性测试。

Raft 共识 - 生产环境使用 OpenRaft,并支持确定性模拟 Walrus WAL - 自定义预写日志,支持两阶段提交、双主题持久化和崩溃恢复 QUIC 传输 - 基于 Quinn 的加密、多路复用网络,支持连接池 确定性模拟 - 受控时间、I/O 故障注入和可复现的随机性,用于崩溃测试 持久性验证 - 多轮崩溃恢复验证,带不变量检查

架构

特性

特性 描述 openraft(默认) 生产模式,使用异步 Raft 和 QUIC 传输 simulation DST 模式,带故障注入和受控时间 openraft-filters 网络分区和延迟模拟

[dependencies] octopii = { git = "https://github.com/octopii-rs/octopii", features = ["openraft"] }

快速开始

use octopii::{Config, OctopiiNode, OctopiiRuntime}; #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { let runtime = OctopiiRuntime::new(4); let config = Config { node_id: 1, bind_addr: "127.0.0.1:5001".parse()?, peers: vec!["127.0.0.1:5002".parse()?], wal_dir: "./data/node1".into(), is_initial_leader: true, ..Default::default() }; let node = OctopiiNode::new(config, runtime).await?; node.start().await?; // 通过共识写入 node.propose(b"SET key value".to_vec()).await?; // 从状态机读取 let value = node.query(b"GET key").await?; println!("Value: {:?}", String::from_utf8(value.to_vec())); Ok(()) 自定义状态机

实现 StateMachineTrait 来复制你自己的逻辑:

impl StateMachineTrait for MyStateMachine { fn apply(&self, command: &[u8]) -> Result<Bytes, String> { /* 确定性执行 / } fn snapshot(&self) -> Vec<u8> { / 序列化状态 / } fn restore(&self, data: &[u8]) -> Result<(), String> { / 从快照恢复 */ } fn compact(&self) -> Result<(), String> { Ok(()) } // 可选 持久性模型

两阶段提交,使用双主题实现抗崩溃:

恢复时,只有带提交标记的条目才可见。即使在操作中途发生崩溃,也能防止部分写入造成的数据损坏。

API.md - API 参考 ARCHITECTURE.md - 系统内部原理 CUSTOM_STATE_MACHINES.md - 状态机指南 SHIPPING_LANE.md - P2P 文件传输

示例

node/、custom_state_machine/、shipping_lane/、rpc/、rpc_shipping_lane/、wal/、runtime/

cargo run --example node --features openraft

确定性模拟测试(DST)

Octopii 实现了 DST,这一方法论由 FoundationDB 首创,并被 TigerBeetle 采用。通过在几分钟内运行数百万次注入故障的操作,找出在生产环境中可能需要数年才会暴露的 bug。

组件 生产环境 模拟环境 时间 tokio::time::Instant SimInstant(受控) 随机性 系统 RNG SimRng(带种子的 XORshift) 文件 I/O 真实文件系统 带故障注入的 VFS 网络 QUIC/TCP 带分区的内存网络

给定一个种子,测试完全可复现。

I/O 错误、部分写入(撕裂页)、fsync 失败、人为延迟。

一致性、持久性(DurabilityOracle)、Raft 不变量、恢复幂等性。

19 个测试文件中共 11,000+ 行测试。集群模拟套件覆盖:

每个类别默认在 50 个种子上运行,每次运行 1000 次操作(压力测试为 5000 次)。

cargo test --features openraft # 标准测试 cargo test --features simulation # 带故障注入的 DST CLUSTER_SEED_COUNT=200 cargo test --features simulation # 扩展覆盖

项目状态

正在积极开发中。DST 基础设施已在数十万次注入故障的操作中验证了崩溃恢复。

依据 Apache License, Version 2.0 许可。详情请参阅 LICENSE。

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →