CQRS 与 EventSourcing 如何优化 read/write

How CQRS with EventSourcing optimizes read/write

据我了解,CQRS 和 ES 可以帮助我们独立优化读写操作。 reading/write 使用分离数据库时,我们可以在读取数据库时设置适当的索引,这样读取就可以高效,并且我们可以以最终一致性为代价快速将数据保存到事件存储中。

这是我的问题:如果两个数据库中的数据需要同步,那么写入读取数据库会导致重建索引,因此它会阻止我们的读取。

我的印象是和reading/write独立的想法冲突。将数据快速保存到事件存储有什么好处,最终保存到读取数据库的时间更长,所以我们并没有真正独立地扩展 r/w 操作。也许我遗漏了什么,我仍在学习这些模式。

PS。英语是我的第二语言,我很抱歉犯了任何错误。

我不确定你的问题到底是什么,但我会尝试在这里阐述我的看法。

如果 read/write 的数据库完全分开,根据定义它们将不会相互影响。以这种方式使用 CQRS 意味着我们 可以 独立扩展 read/write 操作。

但是,可能需要一些时间才能将更新传播到读取模型并可供客户端查询。这就是您为设计最终一致的分布式系统支付的 成本

写入模型和读取模型之间的同步机制可能因实现而异。但是,在分布式 CQRS 系统中,读模型最终与写模型在设计上保持一致,因此它们并非始终同步。读取模型总是赶上,有时它会拥有所有信息。

我希望这能回答你的问题。

根据我使用 CQRS 的经验,它使您可以根据您的要求灵活地使用多种技巧和技术来提高性能。

示例:

  • 对于CQR​​S的命令部分,您可以使用EF Core等高级ORM,
  • 而对于查询部分,您可以使用像 Dapper(更快)或 ADO.NET(甚至更快)这样的 Micro ORM。

关于如何设计数据库的另一个例子:

  • 您为命令事务(规范化)设计了一个数据库
  • 另一个用于查询的同步数据库(非规范化)在查询端提供了更好的性能。

关于如何在数据库之间进行同步,您还有很多选择

所以你在如何提高性能方面很灵活。