.net CQRS+;事件源可扩展性

.net CQRS+;事件源可扩展性,.net,asp.net,architecture,cqrs,event-sourcing,.net,Asp.net,Architecture,Cqrs,Event Sourcing,我正在尝试在我的新项目中使用CQR和事件排序。我遵循Greg Young几年前提出的方法(Mark Nijhof implementation-)。我对这个解决方案的可伸缩性有一些问题 马克·尼霍夫在文章中提到了一些要点。但现在的问题是反规范化部分,它负责更新报告数据库。这部分我想使之异步,所以在将事件发布到总线之后,我想立即返回控制。我们建议将反规范化器实现为一个独立的web服务(WCF),它将处理传入的事件,并使用成批命令定时更新报表数据库。看起来这可能是一个瓶颈,所以我们还想在这一点上增加

我正在尝试在我的新项目中使用CQR和事件排序。我遵循Greg Young几年前提出的方法(Mark Nijhof implementation-)。我对这个解决方案的可伸缩性有一些问题


马克·尼霍夫在文章中提到了一些要点。但现在的问题是反规范化部分,它负责更新报告数据库。这部分我想使之异步,所以在将事件发布到总线之后,我想立即返回控制。我们建议将反规范化器实现为一个独立的web服务(WCF),它将处理传入的事件,并使用成批命令定时更新报表数据库。看起来这可能是一个瓶颈,所以我们还想在这一点上增加一些可伸缩性——集群解决方案。但是在集群的情况下,我们不能控制报告数据库更新的顺序(或者我们应该实现一些奇怪的、我猜是错误的逻辑,它将检查报告数据库中的对象版本)。另一个问题是解决方案的可持续性:在失败的情况下,我们将在反规范化程序中丢失更新,只要我们不在任何地方保持更新)。所以现在我正在寻找这个问题的解决方案(非规范化可伸缩性),欢迎任何想法

首先,您肯定希望在单独的进程中托管反规范化程序。从那里,您可以让域将域中发生的事件发布到消息传递基础结构。帮助加速非规范化的一个简单策略是按消息/事件类型进行分解。换句话说,您可以为每种消息类型创建一个单独的队列,然后让反规范化程序订阅(使用消息总线)相应的事件。这样做的好处是,您不会让消息一个接一个地堆积在一起——一切都开始并行运行。唯一可能存在争用的地方是侦听多个类型的表。即使如此,您现在已经在许多端点之间分配了负载

只要您使用某种消息传递基础结构,在尝试反规范化时就不会丢失事件消息。相反,在一定次数的失败重试后,消息将被视为“有毒”,并移动到错误队列。只需监视错误队列中的问题。一旦消息出现在错误队列中,您就可以检查日志,了解它出现的原因,解决问题,然后将其移回


另一个考虑因素是马克·尼霍夫的例子有些陈旧。中有许多CQRS框架可用,也有堆积如山的建议。

是否可以为每个viewmodel而不是每个事件设置单独的队列?绝对可以。总线基础设施(如NServiceBus)将订阅适当的事件,并告诉发布者它需要应用于特定view model.Thanx的消息副本,以供您回答。嗯,我还考虑了一些反规范化程序的事件分离策略,例如在单独的线程中使用多个队列。我想这里唯一的规则是为每个特定的聚合根保留事件序列。但这里的问题是,在这种情况下,我不知道如何使用集群,甚至不知道是否有可能使用集群,因为集群会破坏事件序列。从单独的进程开始,然后在熟悉系统后组合反规范化端点。我最近在博客上写了一篇关于如何应用消息来读取模型(如果/当它们不按顺序到达时):