0

何时以及由谁负责在基于 CQS 的用例的 DDD 架构中将来自 API GET 请求的数据缓存到本地数据存储中?


首先想到的是:

启动查询以从本地数据存储中获取一些数据,如果为空,则从 API 获取所需数据 -> 将其缓存到本地数据存储中 -> 将其返回

该解决方案似乎没有正确遵循 CQS,因为查询不应该改变数据存储(或者它们可以吗?)。


想到的第二件事:

执行命令以从 API 获取新数据 -> 更新数据存储 -> 引发数据更新事件 -> 事件处理程序侦听数据更新事件并执行新查询以获取新数据


第二种解决方案似乎更好地遵循 CQS 模式,但我不确定这些解决方案中的任何一个是否是在基于 CQS 的架构中处理数据缓存的正确方法。

4

1 回答 1

1

在我看来,第一个选项不是违反 CQS/CQRS 的任何“更大”作为第二个选项。查询不会改变权威状态(例如 DDD 聚合),它只是将其复制到缓存中。它确实需要缓存失效。

第二个是有问题的,因为查询导致命令(有时将查询视为只读命令是合理的(假设查询将自身限制为单个聚合)以获得更强的一致性保证)。

我认为更好的方法是混合两者:

  • 如果可能,从缓存中提供查询
  • 当命令导致对聚合的更新时,会发布事件(理想情况下会列出更改的聚合)
  • 事件处理程序侦听更新事件并根据已更改的聚合使缓存无效。

这种情况的进一步发展将是事件溯源,其中更新是事件,而查询仅由事件提供的读取模型提供服务。

于 2021-08-11T16:30:17.257 回答