4个版本
0.2.2 | 2021年5月5日 |
---|---|
0.2.1 | 2021年5月5日 |
0.2.0 | 2021年5月5日 |
0.1.0 | 2021年4月28日 |
284 in 数据库实现
39KB
879 代码行
Prevayler-rs
这是Klaus Wuestefeld在Rust中提出的一种系统普遍性的简单实现。其他例子包括Java的prevayler和Clojure的prevayler-clj。
想法是将所有对普遍数据的修改保存到一个重做日志中。如果系统重新启动,它将重新应用重做日志中的所有事务,恢复系统状态。系统还可以不时地写入快照,以加速恢复过程。
以下是一个示例程序,该程序使用u8创建一个普遍状态,增加其值,将值打印到屏幕上,然后关闭程序。
use prevayler_rs::{
error::PrevaylerResult,
PrevaylerBuilder,
Prevayler,
serializer::JsonSerializer,
Transaction
};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
struct Increment {
increment: u8
}
impl Transaction<u8> for Increment {
fn execute(self, data: &mut u8) {
*data += self.increment;
}
}
#[async_std::main]
async fn main() -> PrevaylerResult<()> {
let mut prevayler: Prevayler<Increment, _, _> = PrevaylerBuilder::new()
.path(".")
.serializer(JsonSerializer::new())
.data(0 as u8)
.build().await?;
prevayler.execute_transaction(Increment{increment: 1}).await?;
println!("{}", prevayler.query());
Ok(())
}
在大多数情况下,你可能需要不止一个事务。我们现在必须使用一个枚举作为主事务,该事务将被保存到重做日志中。然后所有执行的事务都将转换为它。
有关更多示例,请参阅项目测试
依赖关系
~7–19MB
~243K SLoC