Akka.NET中的事件源和CQRS

crcmnpdw  于 2022-11-06  发布在  .NET
关注(0)|答案(1)|浏览(172)

我对Akka.NET(和Actors)不熟悉,对Akka.NET中的事件源和CQRS有一些疑问
例如,假设我有一个Orders绑定上下文(如在线商店中的Orders)

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会遇到我刚才描述的同样的问题。

uqdfh47h

uqdfh47h1#

Akka.Persistence.Query是在Akka.Peristence之上实现CQRS的合适工具。它允许您在事件提交后定期从Akka.Persistence日志中读取事件,并可用于创建投影和物化视图。
您可以在这里看到我使用Akka.Persistence.Query和Akka.Cluster实现的一个大规模示例:https://github.com/Aaronontheweb/InMemoryCQRSReplication

相关问题