从 CQRS 写入端数据库读取数据

Edg*_*oks 5 architecture cqrs

背景 :

解释 CQRS 的图表通常会清楚地分离读写路径和单向数据流,就像在这个例子中一样(来源:Demystified CQRS):在此处输入图片说明

题 :

我想澄清一下,

如果后端的命令执行需要从数据库中获取一些数据,

  • “写入端”是否应该从写入数据库中获得一些读取功能?
  • 或者它应该完全依赖“读取端”进行任何读取?
  • 或者命令应该包含调用者提供的所有必需数据来完成?

Voi*_*son 6

“写入端”是否应该从写入数据库中获得一些读取功能?

可能 - 加载将要运行命令的实体的最直接方法是从“写入数据库”读取其状态。例如,在事件源架构中,更新事件源实体的命令通常通过从写入模型加载该实体的历史记录、从该历史记录中重新组合实体、评估该命令并将新更改附加到历史记录来处理。

读取处理命令的实体的状态是另一回事词汇在这里有帮助;您正在修改的状态恰好属于一个聚合,只要有可能,就应该将聚合之外的状态传递给模型,而不是获取。

这可能意味着远程客户端需要提供数据,或者可能意味着处理命令的应用程序获取所需的读取模型并提供答案。有许多不同的问题会影响您在此处做出的选择

  • 如果客户端在生成命令时使用的读取模型与应用程序在处理命令时使用的视图显着不同,则存在一定风险。
  • 保持稳定的 API 使您可以自由地重新设计模型中的聚合边界,而无需更新客户端)。

所以没有一个最佳答案,只是在不同的关注点之间进行权衡。

最近出现了后者的一个例子——如果您的业务模型要求某些命令需要特定用户的权限,那么我们不应该从表面上获取客户的命令;我们需要应用程序验证命令发布者的身份,然后将该身份的表示传递给模型,以便它可以确定要采取的操作。