CQRS:具有查询或查找服务的复杂事件处理程序

CQRS: Complex Event Handler with Query or Lookup service

我相信关于填充读取模型/预测的事件处理程序的一般指导是让它们保持简单。

从事件处理程序执行查询的指导是什么,或者最好是使用查找域服务returns 视图需要的一些信息?

我的具体示例是一个包含国家代码的事件,我想在读取模型中显示为国家名称(和其他国家信息)。 IE。高度稳定的数据,尽管不能保证它在未来的某个时刻永远不会改变。一些想法:

是否有任何以前的经验会导致某人建议这些选项中的一个而不是另一个?

选项 2 是文献中的常见选择 - 我们 运行 一个异步过程,它从一个或多个持久存储中收集值并组成一个新的表示形式,该表示形式被缓存以供您的只读用例使用.

实际上,我们从记录簿中读取的 "our" 数据与我们拥有陈旧副本的 "their" 数据之间几乎没有区别。

Risks: it adds a db read (via the domain service) to the event handler, which is creating an additional potential failure point.

那又怎样?我们只会失败,稍后重试。无论如何,我们的只读视图都是陈旧的副本;任何期望纳秒级或更好延迟的人都是在自欺欺人。

换句话说,我们不关心失败,我们关心的是达到我们的服务水平目标,以及我们耗尽错误预算的速度。

Re-running the events to project the view model again could result in different state. ie. that country doesn't exist anymore.

无论如何,情况总是如此——从你决定进行分布式处理的那一刻起;陈旧的数据变得不可避免。建模时间可以提供帮助,确保语义保持稳定(我们可以继续理解国家代码的语义,即使那个国家不再存在。)