#事件源 #事件存储 #嵌入式数据库 #wasm

thalo

一个高性能的事件源运行时,利用 WebAssembly 和嵌入式事件存储

15 个不稳定版本 (6 个重大更改)

0.8.0 2023年11月21日
0.7.0 2023年11月10日
0.5.0 2022年1月20日
0.4.0 2022年1月1日
0.1.3 2021年11月28日

#1764异步

Download history 118/week @ 2024-04-10 7/week @ 2024-04-17 12/week @ 2024-04-24 5/week @ 2024-05-01 9/week @ 2024-05-08 8/week @ 2024-05-15 4/week @ 2024-05-22 22/week @ 2024-05-29 15/week @ 2024-06-05 10/week @ 2024-06-12 9/week @ 2024-06-19 14/week @ 2024-06-26 13/week @ 2024-07-03 4/week @ 2024-07-10 12/week @ 2024-07-17 68/week @ 2024-07-24

每月99 次下载
8 crates 中使用

Apache-2.0 OR MIT

27KB
389

Thalo 是一个事件源运行时,通过 wasmtime 利用 WebAssembly (wasm) 的力量,结合 sled 作为嵌入式事件存储。它设计用于处理使用编译的聚合 wasm 组件的命令,并持久化生成的事件,有效地管理从先前事件重建聚合状态。

计数器聚合示例

此示例展示了一个基本的计数器聚合,允许按一定数量增加计数。

#
use serde::{Deserialize, Serialize};
use thalo::{events, export_aggregate, Aggregate, Apply, Command, Event, Handle};

export_aggregate!(Counter);

pub struct Counter {
    count: u64,
}

impl Aggregate for Counter {
    type Command = CounterCommand;
    type Event = CounterEvent;

    fn init(_id: String) -> Self {
        Counter { count: 0 }
    }
}

#[derive(Command, Deserialize)]
pub enum CounterCommand {
    Increment { amount: u64 },
}

impl Handle<CounterCommand> for Counter {
    type Error = Infallible;

    fn handle(&self, cmd: CounterCommand) -> Result<Vec<CounterEvent>, Self::Error> {
        match cmd {
            CounterCommand::Increment { amount } => events![Incremented { amount }],
        }
    }
}

#[derive(Event, Serialize, Deserialize)]
pub enum CounterEvent {
    Incremented(Incremented),
}

#[derive(Serialize, Deserialize)]
pub struct Incremented {
    pub amount: u64,
}

impl Apply<Incremented> for Counter {
    fn apply(&mut self, event: Incremented) {
        self.count += event.amount;
    }
}

依赖

~0.9–1.8MB
~38K SLoC