#event-store #events #back-end #applications #building #runtime-storage #chekov

event_store-core

用于构建 event_store 运行时/存储的核心结构和特性

1 个不稳定版本

0.1.0 2022年1月30日

#21 in #backends

MIT/Apache

21KB
515 行代码(不包括注释)

Chekov

A CQRS/ES 框架,用于使用 Rust 构建 应用程序

Actions Status Coverage Status dependency status Crates.io doc.rs doc-latest

目录


特性

  • Postgres EventStore 后端
  • Command 分发到 AggregateCommandHandler
  • Aggregate 生成 Event 并持久化它们
  • Event 应用到 Aggregate
  • 使用订阅存储和通知 Event
  • Event 分发到 EventHandler

入门指南

选择 EventStore 后端

Chekov 目前仅支持 Postgres 后端(以及 InMemory 用于测试目的)。选择很简单!

但还需要实现更多后端,请参阅相关问题

定义聚合

聚合是一个包含领域状态的 struct。以下是一个 UserAggregate 的示例

#[derive(Default, Aggregate)]
#[aggregate(identity = "user")]
struct User {
    user_id: Option<Uuid>,
    account_id: Option<Uuid>,
}

/// Define an Executor for the `CreateUser` command
/// The result is a list of events in case of success
impl CommandExecutor<CreateUser> for User {
  fn execute(cmd: CreateUser, _state: &Self) -> Result<Vec<UserCreated>, CommandExecutorError> {
    Ok(vec![UserCreated {
      user_id: cmd.user_id,
      account_id: cmd.account_id,
    }])
  }
}

/// Define an Applier for the `UserCreated` event
/// Applier is a mutation action on the aggregate
#[chekov::applier]
impl EventApplier<UserCreated> for User {
  fn apply(&mut self, event: &UserCreated) -> Result<(), ApplyError> {
    self.user_id = Some(event.user_id);
    self.account_id = Some(event.account_id);

    Ok(())
  }
}

定义命令

您需要为每个命令创建一个 struct,任何类型的 struct 都可以实现 Command,但我们建议使用 struct 以提高可读性。

命令只能产生(或不产生)一种类型的事件,并且它针对单个聚合。命令必须有一个单一且唯一的 identifier,该标识符用于将命令路由到正确的目标。


#[derive(Debug, Command)]
#[command(event = "UserCreated", aggregate = "User")]
struct CreateUser {
    #[command(identifier)]
    user_id: Uuid,
    account_id: Uuid,
}

定义事件

Event 可以是一个 struct 或一个 enum

#[derive(Event, Deserialize, Serialize)]
struct UserCreated {
    user_id: Uuid,
    account_id: Uuid,
}

定义 Saga

尚未实现

常见问题解答

Chekov 是否已经准备用于生产?

不是。项目的某些关键部分尚未实现,并且在实现之前需要大量重构代码。

需要帮助?

如果遇到错误或功能请求,请随时在 GitHub 上创建问题。如果您的问题既不是错误也不是功能请求,讨论 也是一个很好的开始。

贡献

项目处于非常早期阶段,有许多待办任务,其中一项主要任务是制定路线图或可以用来展示项目愿景的一些问题。如果您想讨论这个问题,请随时打开讨论

依赖项

~15–28MB
~432K SLoC