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

CQRS是如何实现的,读取数据库是在哪里创建的

危飞跃
2023-03-14

我有发现服务: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网关来访问产品服务。

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

在产品服务下,我有< code > src/main/Java/com/appsdeveloperblog/estore/products service/command/product aggregate . 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,用于查询数据库。

这里是CRQS的ProductsQueryHandleris查询。

我的问题如下

  1. 我无法理解发布事件是如何以及何时生成的,以及何时将消息放入消息队列
  2. 另外,数据保存到
  3. 事件存储后,是否有可能不存储在读取数据库中。如果是,那么我们如何同步读取数据库。

共有1个答案

叶光华
2023-03-14

我无法理解发布事件是如何以及何时生成的,以及何时将消息放入消息队列。

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

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

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

数据是否可能在持久化到事件存储后,不存储在读取数据库中。

是的。这种情况有多普遍取决于...实际上,这主要取决于你在可靠性上投入了多少。

这就是为什么拉取模型往往很受欢迎——读取过程可以跟踪它看到了哪些事件,并在X之后请求下一批消息——其中X是时间戳、序列号或其他东西。

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

 类似资料:
  • 我有一个ASP。NET MVC6应用程序,我需要调用和方法。 但是我应该在哪里打电话给他们呢?

  • 我试图运行迁移与自定义DbContext。 这会引发迁移异常,因为未实现无参数构造函数: “目标上下文”系统。数据实体DbContext“”不可构造。添加默认构造函数或提供IDbContextFactory的实现。 构造函数需要参数,但我已经有了

  • 有没有办法知道实体是否是从数据库中读取的? 这个问题与如何知道一个分离的JPA实体是否已经被持久化有关?。但是检查其主键的变通方法没有回答我的问题。对于从导入文件中读取主键的实体来说,它是不起作用的。 将问题引申如下: JPA实现如何确定是否要插入或更新实体?

  • 我正在一个聊天应用程序,其中消息存储在firebase实时数据库。现在,如果我创建一个如下所示的节点(Chats-Better-A-ID和-B-ID是自动生成的聊天室密钥),那么我想知道当用户S在聊天应用程序中打开与用户T聊天时,so数据库将只读取存储在Chats-Better-S-T-ID中的消息,而不会读取其他聊天室消息!?我说的对吗?如果是,那么它会降低定价吗? 或 如果我存储如下所示的数据

  • 我有一个DBA创建的表。我想为每个表提供实体类以供进一步查询。有人能建议如何使用eclipse自动创建实体类吗?

  • 我在docker容器中设置了一个django项目,每件事都按照预期工作,只是我没有在mysql映像中找到项目数据库。 DockerFile Docker-compose.yml 设置.py 你能告诉我缺了什么吗?如果没有创建数据库,迁移应用到了哪里? 提前道谢。