Akka.NET 中的事件溯源和 CQRS

Event Sourcing and CQRS in Akka.NET

我是 Akka.NET(以及一般的 Actor)的新手,对 Akka.NET

中的事件溯源和 CQRS 有一些疑问

例如,我有一个订单限界上下文(如在线商店中的订单)

class OrdersAggregate
{
    public OrdersAggregate()
    {
        Command<NewOrder>(o => HandleNewOrder(o));
    }
    
    void HandleNewOrder(NewOrder o)
    {
        Persist(o, e =>
        {
            // update state
        });
    }
}

围绕这些订单实施读取存储的最佳方式是什么(例如,为 UI 设置专用读取存储)?

我看到可以在命令持久化后发送事件,就像这样

Persist(o, e =>
{
    // update state
    Context.System.EventStream.Publish(e);
});

然后我可以订阅该消息并将其通过管道传输到负责将消息存储在数据库中的角色,该数据库将用作我的读取存储,但看起来这种方法容易出错,因为没有办法以保证事件发布不会失败。 (通常,如果没有 Akka,我会使用发件箱模式之类的东西来确保事务中发生持久性和事件传递)。

那么这是发送事件以构建读取存储的好方法还是有更好的方法?

我的第二个问题很相似。在 Akka.NET 中发送跨域事件(跨边界上下文)的最佳模式是什么?
比如我想从仓库限界上下文

订阅NewOrderCreated事件

看起来使用 Context.System.EventStream.Publish 会遇到我刚才描述的相同问题。

Akka.Persistence.Query 是在 Akka.Peristence 之上实现 CQRS 的正确工具。这允许您在事件提交后定期从 Akka.Persistence 日志中读取事件,并可用于创建投影和物化视图。

您可以在此处查看我使用 Akka.Persistence.Query 和 Akka.Cluster 实现的大型示例:https://github.com/Aaronontheweb/InMemoryCQRSReplication