Akka.NET 中的事件溯源和 CQRS
Posted
技术标签:
【中文标题】Akka.NET 中的事件溯源和 CQRS【英文标题】:Event Sourcing and CQRS in Akka.NET 【发布时间】:2021-03-07 22:46:25 【问题描述】:我是 Akka.NET(和一般的 Actor)的新手,对 有一些疑问
例如,假设我有一个 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
会遇到我刚才描述的同样的问题。
【问题讨论】:
【参考方案1】:Akka.Persistence.Query 是在 Akka.Peristence 之上实现 CQRS 的正确工具。这允许您在提交后定期从 Akka.Persistence 日志中读取事件,并可用于创建投影和物化视图。
您可以在此处查看我使用 Akka.Persistence.Query 和 Akka.Cluster 实现的大型示例:https://github.com/Aaronontheweb/InMemoryCQRSReplication
【讨论】:
您好,您提到“定期读取事件”,这是否意味着必须以某种方式安排读取?我可以订阅事件并在发生时获取事件吗?是否可以为此目的使用 Akka.Persistence.Query? 是的,它可以@DavidY - Akka.Persistence.Query 具有无限期运行的永久查询,并根据偏移量(通常是时间戳或序列号)发现新事件。它们通常通过定期轮询使用数据库中特定标签或实体 ID 的数据并将其发布给所有订阅者来工作。这有助于回答你的问题吗?还有其他我可以提供给您的信息吗? 非常感谢@Aaronontheweb!这很有帮助! Akka.Net 的学习曲线相当陡峭。您认为最好的学习方法是什么?以上是关于Akka.NET 中的事件溯源和 CQRS的主要内容,如果未能解决你的问题,请参考以下文章