thalo-rs/thalo:wasm 的事件溯源运行时


Thalo 是用于构建分布式系统的事件源运行时。[url=https://wasmtime.dev/]它建立在组件的Wasmtime[/url]之上,并使用消息数据库作为消息存储。

聚合体由任何支持的编程语言编译成wasm,并发布到注册表,由运行时用于处理命令。


什么是事件溯源
事件溯源是基于不可变事件的编程模式,这些事件充当应用程序的真实来源。
与传统的面向状态的方法不同,您的数据由小事件组成,您的模型可以通过一个一个地重放这些事件来计算读取模型来构建。
事件溯源的一个常见示例是会计,其中您的银行余额是所有交易(也称为事件)的总和。一个更熟悉的使用事件溯源的技术是 Git。
有什么好处?

  • 可扩展性
    事件源系统可以以非常松散耦合的并行方式运行,提供出色的水平可扩展性和系统故障恢复能力。
  • 时间旅行
    通过存储不可变事件,您可以在任何时间点确定应用程序状态。
  • 表现力模型
    事件是系统中的一流对象,显示数据更改背后的意图。它使隐式显式。

事件溯源和 CQRS 生态系统似乎由 C# 和 Java 主导。Thalo 旨在使用 WebAssembly 扩大这一范围,允许使用任何支持的语言编写组件,而不仅仅是 Rust。

ESDL - 事件溯源模式定义语言
聚合、命令和事件以ESDL 模式语言定义。
这允许更具可读性的聚合定义,并提供代码生成来生成类型和特征。
的示例.esdl可以在 中找到examples/bank_account/bank_account.esdl


counter.esdl

version = "0.1.0"

aggregate Counter {
  increment(amount: Int) -> Incremented
  decrement(amount: Int) -> Decremented
}

event Incremented {
  amount: Int
}

event Decremented {
  amount: Int
}


counter.rs:


#[derive(Aggregate, Serialize, Deserialize)]
#[aggregate(schema = "counter.esdl")]
pub struct Counter { … }

impl CounterAggregate for Counter {
  fn new(id: String) -> Result<Self, Error> { … }

  fn apply_incremented(&mut self, ctx: Context, event: Incremented) { … }
  fn apply_decremented(&mut self, ctx: Context, event: Decremented) { … }
  fn handle_increment(&self, ctx: &mut Context, amount: i32) -> Result<Incremented, Error> { … }
  fn handle_decrement(&self, ctx: &mut Context, amount: i32) -> Result<Decremented, Error> { … }
}

export_aggregate!(Counter);

构建发布:

# Build your component
cargo build --target wasm32-wasi
# Publish to Thalo
thalo-cli publish counter.esdl counter.wasm


例子包括:


所有示例都可以在目录中看到examples