首页 > 解决方案 > 如何实现 CQRS 以及在哪里创建读取数据库

问题描述

我有发现服务:https ://github.com/Naresh-Chaurasia/API-MicroServices-Kafka/tree/master/Microservices-CQRS-SAGA-Kafka/DiscoveryService

我有产品服务:https ://github.com/Naresh-Chaurasia/API-MicroServices-Kafka/tree/master/Microservices-CQRS-SAGA-Kafka/ProductsService

我有 API 网关:https ://github.com/Naresh-Chaurasia/API-MicroServices-Kafka/tree/master/Microservices-CQRS-SAGA-Kafka/ApiGateway

产品服务和 API 网关注册到发现服务。我使用 API Gateway 访问产品服务。

我正在学习为产品服务实施 CQRS 的课程。

在 ProductService 下,我有src/main/java/com/appsdeveloperblog/estore/ProductsService/command/ProductAggregate.java

这里的 ProductAggregate 是CRQS 的命令

它有以下方法(请参阅 GitHub 了解更多详细信息):

@CommandHandler
public ProductAggregate(CreateProductCommand createProductCommand) throws Exception {
...
}

@EventSourcingHandler
public void on(ProductCreatedEvent productCreatedEvent) {
...
}

它还具有src/main/java/com/appsdeveloperblog/estore/ProductsService/query/ProductEventsHandler.java,将产品保留在 H2 db 中。

我也实现src/main/java/com/appsdeveloperblog/estore/ProductsService/query/ProductsQueryHandler.java了,用于查询数据库。

这里的 ProductsQueryHandler是 CRQS 的查询

在此处输入图像描述

我的问题如下

  1. 我无法理解发布事件的生成方式和时间,以及消息何时放入消息队列。
  2. 另外,数据持久化到Event Store后,是否有可能不存储在Read DB中。如果是,那么我们如何同步读取数据库。

标签: spring-bootmicroservicescqrsevent-driven-design

解决方案


我无法理解发布事件的生成方式和时间,以及消息何时放入消息队列。

它发生事件发布到事件存储之后。

有许多可能的设计可用于将事件从事件存储复制到查询端的事件处理程序。这些将包括

  • 让应用程序代码将事件复制到事件处理程序订阅的消息队列中
  • 让事件处理程序按计划从事件存储中提取一批事件
  • 让事件处理程序从事件存储中拉取事件,但使用消息队列来宣布有新消息要拉取。

是否有可能数据持久化到Event Store后,没有存储在Read DB中。

是的。这有多普遍取决于……嗯,实际上这主要取决于您在可靠性方面投入了多少。

这就是为什么拉模型趋于流行的原因——读取过程可以跟踪它所看到的事件,并在 X 之后请求下一批消息——其中 X 是时间戳、序列号或其他东西。

警告:如果您尝试推出自己的活动商店,正确获取这些详细信息可能会很棘手。除非活动商店的细节是您竞争优势的一部分,否则您真的想购买可靠性而不是试图建立它。


推荐阅读