当前位置: 首页 > 知识库问答 >
问题:

事件来源和CQRS,我错过了什么?

益银龙
2023-03-14

我开始阅读与CQRS相结合的事件源模式。据我所知,CQRS模式是一种将写操作和读操作分开的模式。事件源是一种模式,系统中的一切都由触发事件的命令启动。事件源模式需要一个事件总线。有几件事我没弄明白。

事件存储区包含发生在某个实体上的所有事件。如果我想查询这个实体的当前状态,我需要查询发生在这个实体上的所有事件,并重新创建它的当前状态。
所有事件历史记录都在事件存储区中。
为什么我不能有一个负责将每个事件保存到事件数据库中的微服务(如果我想记录这些事件以进行进一步操作。类似于Kafka)和一个单独的微服务来更新常规数据库中实体的更改(例如,在MongoDB中对实体文档的简单更新)。当这些微服务完成它们的工作时,这个事件将从事件存储区中移除(假设我使用队列实现了这个事件存储区)。这样,每当我需要查询实体的当前状态时,我只需查询一个数据库,而不是查询事件存储并重新构建当前状态(或者根据事件存储重新计算状态并定期缓存结果)。我不明白为什么强制永远存储所有事件,为什么不是可选的?

例如,接收事件的Lambda函数生成事件,并将它们存储在每个事件类型的单独SQS中。每个SQS都有自己的负责处理相应事件类型的lambda函数。事件一旦处理完毕就会移除。

共有1个答案

璩正志
2023-03-14

事件源模式需要一个事件总线。

事件源不需要总线,除非您需要将更改(事件)通知其他系统/域。

如果我想查询这个实体的当前状态,我需要查询这个实体发生的所有事件,并重新创建它的当前状态。

你可以的!

当这些微服务完成它们的工作时,这个事件将从事件存储区中移除(假设我使用队列实现了这个事件存储区)。

你也可以这样做,但你不做事件来源。这更像是“事件驱动的体系结构”,它不使用事件源是可能的,也是完全有效的,但并没有提供所有相同的好处。在事件源系统中,事件存储是数据真实值的来源,队列不是存储真实值的有效位置,因为它实际上并不是要长期存储数据。

 类似资料:
  • 很明显,基于这些模式的系统是易于扩展的。但我想问你,具体怎么做?关于可伸缩性,我没有什么问题: 如何缩放聚合体?如果我将创建

  • 我想创建一个CQRS和事件源架构,非常便宜,非常灵活,非常简单。 我想确保事件永远不会失败,至少到达发布者/事件存储,永远,因为这是业务所在。 天蓝 有了azure,我似乎不知道该用什么。 Azure服务总线 蔚蓝函数 Azure webjob(我想这可以用Azure函数代替) ??(还有什么我忘了或者不知道的?) null 你的经验说明了什么? 其他替代方案呢?(例如:)?

  • 当我在读一些CQRS的资料时,有一个反复出现的问题我没有理解。例如,假设一个客户端发出一个命令。该命令由域集成,因此它可以刷新其域模型(DM)。另一方面,命令保存在事件存储中。这是最常见的情况。 1) 当我们说DM被刷新时,我假设数据被保存在底层数据库中(如果有的话)。我说得对吗?否则,我们将处理内存瞬态模型,我想这不是一件好事吗?(在客户端请求之外,状态不应该保留在服务器端的内存中)。 2)如果

  • 我想使用事件源和CQRS,所以我需要预测(我希望我使用的是正确的术语)来更新我的查询数据库。如何处理数据库错误? 例如,我的一个查询缓存数据库不可用,但我已经更新了其他数据库。因此,当snyc回到业务中时,不可用的数据库将不会与其他数据库一起在snyc中。它如何知道它必须运行例如事件存储中的最后10个域事件?我想我必须存储有关数据库当前状态的信息,但是如果数据库状态存储失败怎么办?有什么想法,最佳

  • 事件源和CQRS很棒,因为它让rids开发人员被一个预先建模的数据库所困,除非有一个大的数据迁移项目,否则开发人员必须在应用程序的生命周期内使用该数据库。CQRS和ES还有其他好处,比如扩展eventstore、审计日志等,这些都已经遍布互联网。 但是缺点是什么呢? null

  • 我在CQRS/ES设计中有一个计时案例。为了便于讨论,让我们以Microsoft关于这个主题的示例会议管理为基础(https://msdn.microsoft.com/en-us/library/jj554200.aspx)。 假设在第1分钟创建会议(最大座位数为20)。 在第4分钟,事件到达order mgmt上下文,因此创建了一个座位可用性。 在第7分钟,用户下了一个订单(通过订单管理),购买