【问题标题】:In CQRS how to work with NServiceBus to update Command and Query store在 CQRS 中如何使用 NServiceBus 更新命令和查询存储
【发布时间】:2015-10-15 03:52:16
【问题描述】:

在 CQRS 中,如何确保命令处理程序以事务方式更新写入存储和读取存储?

我不确定这两个步骤是否应该是一个交易? 还是您在这里依赖最终的一致性?意思是读取存储最终会更新?

使用 NServiceBus 5 或 6 的(或一种)常用方法是什么?

在我们的应用程序中,我们有 IRepository<T> (Add, Update) 用于命令端更新 Sql Server 数据库。 查询方面很简单。 Entity Framework DbContext 之上的数据库和外观。

命令端的步骤是:

  1. MVC 控制器从 View 接收数据
  2. 控制器操作创建一个命令/消息对象并将其发送到总线。
  3. 适当的命令处理程序创建适当的域对象并对其进行验证。
  4. 如果有效,则使用 IRepository 插入或更新数据库。
  5. 现在呢?

这是否必须是 NServiceBus 中的 Saga,其中第 1 步和第 2 步更新命令存储和读取存储?

谢谢。

【问题讨论】:

  • +1,你最后是怎么处理这个问题的?您是创建两条消息(一条用于写入,一条用于读取)还是执行写入插入然后创建一条用于读取的消息?谢谢。

标签: c# .net asp.net-mvc-5 cqrs nservicebus5


【解决方案1】:

我看到的流程如下:

  • 控制器接收动作并在命令总线中发出命令
  • 正确的命令处理程序被触发并更新写入模型
  • 在命令处理程序中,触发了一个事件
  • 触发适当的事件处理程序并更新读取模型

因此更新读取模型在事件处理程序中完成 - 因此最终的一致性

希望这会有所帮助!祝你好运!

【讨论】:

  • 但是如果出现问题怎么办,例如无法更新读取存储,或无法更新命令存储。这两个操作不应该在某种事务中吗?感谢您的帮助。
  • 这就是为什么它被称为最终一致性。如果更新读取数据的事件处理程序出现问题,您始终可以标记它出错并重试执行。 (因为你有非常精细的事件处理程序,你不必做 2 次)
  • 好的。所以“标志”意味着我会引发另一个将在 MVC 应用程序中处理的事件(例如 SyncFailedEvent),例如通知用户错误?这也通过NServiceBus?
  • 我不确定最终用户是否需要知道读取模型尚未成功更新,但您可以引发失败的事件,或者在 try-catch 中捕获它块。
  • +1,你最后是怎么处理这个问题的?您是创建两条消息(一条用于写入,一条用于读取)还是执行写入插入然后创建一条用于读取的消息?谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 2016-11-27
  • 1970-01-01
相关资源
最近更新 更多