spring-boot - 如何实现 CQRS 以及在哪里创建读取数据库
问题描述
产品服务和 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 的查询。
我的问题如下
- 我无法理解发布事件的生成方式和时间,以及消息何时放入消息队列。
- 另外,数据持久化到Event Store后,是否有可能不存储在Read DB中。如果是,那么我们如何同步读取数据库。
解决方案
我无法理解发布事件的生成方式和时间,以及消息何时放入消息队列。
它发生在事件发布到事件存储之后。
有许多可能的设计可用于将事件从事件存储复制到查询端的事件处理程序。这些将包括
- 让应用程序代码将事件复制到事件处理程序订阅的消息队列中
- 让事件处理程序按计划从事件存储中提取一批事件
- 让事件处理程序从事件存储中拉取事件,但使用消息队列来宣布有新消息要拉取。
是否有可能数据持久化到Event Store后,没有存储在Read DB中。
是的。这有多普遍取决于……嗯,实际上这主要取决于您在可靠性方面投入了多少。
这就是为什么拉模型趋于流行的原因——读取过程可以跟踪它所看到的事件,并在 X 之后请求下一批消息——其中 X 是时间戳、序列号或其他东西。
警告:如果您尝试推出自己的活动商店,正确获取这些详细信息可能会很棘手。除非活动商店的细节是您竞争优势的一部分,否则您真的想购买可靠性而不是试图建立它。
推荐阅读
- string - 如何从文本 kotlin 中检索特定字符串?
- ios - 在 iOS 上将 16 通道压缩音频读入 AVAudioPCMBuffer?
- javascript - Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 0 using basic fetches and thunk
- mongodb - MongoDB不断高cpu使用率并终止MongoDB
- angular - 我在模态窗口中使用 ng-autocomplete 进行自动建议。但是,如果建议更多,我想在输入顶部显示列表
- npgsql - 为 Windows 安装 Npgsql
- date - Power BI:从不同的表中过滤具有多个位置的销售表在各自的开始日期
- java - 添加额外的 Spring Security 方法注解
- database - 编写一个 pl sql 块来获取不同的部门 ID
- javascript - 自动填充输入中的日期选择器问题 (jQuery/Ajax)