CQRS:具有查询或查找服务的复杂事件处理程序
CQRS: Complex Event Handler with Query or Lookup service
我相信关于填充读取模型/预测的事件处理程序的一般指导是让它们保持简单。
从事件处理程序执行查询的指导是什么,或者最好是使用查找域服务returns 视图需要的一些信息?
我的具体示例是一个包含国家代码的事件,我想在读取模型中显示为国家名称(和其他国家信息)。 IE。高度稳定的数据,尽管不能保证它在未来的某个时刻永远不会改变。一些想法:
选项 1: 我们可以在命令处理程序中进行查找并在事件发布时添加到事件中。这确实意味着命令处理程序需要纯粹使用域服务来填充事件,并且可能需要将值传递给引发所述事件的写入模型。在我看来,这似乎污染了写入模型,我想避免这种情况。对我来说这是最不受欢迎的选择。
选项 2: 查找由更新需要国家/地区名称的读取模型/视图的事件处理程序执行。风险:它向事件处理程序添加了数据库读取(通过域服务),这会创建一个额外的潜在故障点。重新 运行 事件以再次投影视图模型可能会导致不同的状态。 IE。那个国家已经不存在了。尽管风险很低,但与我的用例中的陈旧数据相比,这实际上可能是更可取的结果。
选项 3: 查找在查询处理程序中执行,并在请求时与视图结合。风险:使查询处理程序复杂化并在读取点而不是写入/事件阶段增加性能命中。
是否有任何以前的经验会导致某人建议这些选项中的一个而不是另一个?
选项 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.
无论如何,情况总是如此——从你决定进行分布式处理的那一刻起;陈旧的数据变得不可避免。建模时间可以提供帮助,确保语义保持稳定(我们可以继续理解国家代码的语义,即使那个国家不再存在。)
我相信关于填充读取模型/预测的事件处理程序的一般指导是让它们保持简单。
从事件处理程序执行查询的指导是什么,或者最好是使用查找域服务returns 视图需要的一些信息?
我的具体示例是一个包含国家代码的事件,我想在读取模型中显示为国家名称(和其他国家信息)。 IE。高度稳定的数据,尽管不能保证它在未来的某个时刻永远不会改变。一些想法:
选项 1: 我们可以在命令处理程序中进行查找并在事件发布时添加到事件中。这确实意味着命令处理程序需要纯粹使用域服务来填充事件,并且可能需要将值传递给引发所述事件的写入模型。在我看来,这似乎污染了写入模型,我想避免这种情况。对我来说这是最不受欢迎的选择。
选项 2: 查找由更新需要国家/地区名称的读取模型/视图的事件处理程序执行。风险:它向事件处理程序添加了数据库读取(通过域服务),这会创建一个额外的潜在故障点。重新 运行 事件以再次投影视图模型可能会导致不同的状态。 IE。那个国家已经不存在了。尽管风险很低,但与我的用例中的陈旧数据相比,这实际上可能是更可取的结果。
选项 3: 查找在查询处理程序中执行,并在请求时与视图结合。风险:使查询处理程序复杂化并在读取点而不是写入/事件阶段增加性能命中。
是否有任何以前的经验会导致某人建议这些选项中的一个而不是另一个?
选项 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.
无论如何,情况总是如此——从你决定进行分布式处理的那一刻起;陈旧的数据变得不可避免。建模时间可以提供帮助,确保语义保持稳定(我们可以继续理解国家代码的语义,即使那个国家不再存在。)