Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Microservices 带有CQR和事件源的micoservice应用程序示例_Microservices_Cqrs_Event Sourcing - Fatal编程技术网

Microservices 带有CQR和事件源的micoservice应用程序示例

Microservices 带有CQR和事件源的micoservice应用程序示例,microservices,cqrs,event-sourcing,Microservices,Cqrs,Event Sourcing,我计划创建一个简单的微服务应用程序(设置和获取约会),包括CQR和事件来源,但我不确定是否所有内容都正确。计划如下: docker容器:带有REST端点的公共交付应用程序,用于获取和设置约会。设置数据的端点正在触发RabbitMQ事件(异步),获取数据的端点正在调用命令服务(同步) docker容器:用于连接到SQL数据库的命令服务,用于设置(和编辑)约会。它正在侦听主应用程序的RabbidMQ事件。更改不会覆盖数据,而是使用新版本创建新条目。当数据发生更改时,它还会触发一个事件,将新数据同步到

我计划创建一个简单的微服务应用程序(设置和获取约会),包括CQR和事件来源,但我不确定是否所有内容都正确。计划如下:

  • docker容器:带有REST端点的公共交付应用程序,用于获取和设置约会。设置数据的端点正在触发RabbitMQ事件(异步),获取数据的端点正在调用命令服务(同步)
  • docker容器:用于连接到SQL数据库的命令服务,用于设置(和编辑)约会。它正在侦听主应用程序的RabbidMQ事件。更改不会覆盖数据,而是使用新版本创建新条目。当数据发生更改时,它还会触发一个事件,将新数据同步到查询服务
  • docker容器:用于命令服务的SQL数据库
  • docker容器:连接到MongoDB的查询服务。它正在侦听命令服务中的更改以更新其数据库。主应用程序可以调用数据,但不使用REST,而是使用
  • docker容器:一个事件源服务,用于侦听所有命令并将其存储在MongoDB中
  • docker容器:事件MongoDB
  • 以下是几个我不明白的问题:

    • 假设命令数据库中有一个约会,它已经同步到查询服务。现在有人要求更改这项任命的名称。因此,命令服务不是在执行更新,而是在执行具有相同id但具有新版本号的插入。之后它在做什么?从SQL读取新数据并触发事件?查询服务正在侦听并在其MongoDB中存储相同的数据?它是覆盖旧数据还是用版本创建新条目?这似乎是多余的?我真的需要这里的SQL数据库吗

    • 如果不想使用REST,主应用程序如何从查询服务调用数据

    • 因为它将所有命令存储在事件数据库(6.docker容器)中,所以可以通过按顺序再次运行所有命令来恢复每个状态。这是“事件来源”吗?或者是“事件源”不更改SQL中的数据,而是为每次更改创建新版本?我不知道什么是精确的事件来源,在哪里应用它。我真的需要这5个吗。(和6.)事件来源的docker容器

    • 当客户机想要更改某些内容,但之后又显示更改后的数据时,我看到的唯一方法是触发更改,然后等待(比如轮询)查询服务获得该数据。实现这一目标的好方法是什么?可能正在检查是否存在未来版本号

    • 这整个结构是合理的架构还是我完全遗漏了什么


    抱歉,有很多问题,但谢谢您的帮助

    让我们先看这个

    这整个结构是合理的结构还是我完全正确 遗漏了什么

    很好的建筑规划!我知道这感觉像是有很多运动的片段,但是有很多小片段而不是一个大片段是我最喜欢的图案

    之后它在做什么?从SQL和SQL数据库中读取新数据 用它触发事件?查询服务正在侦听和删除 在MongoDB中存储相同的数据?它是否覆盖了旧数据 或者也创建一个具有版本的新条目?这似乎很有道理 冗余的我真的需要这里的SQL数据库吗

    CQR中有两个逻辑数据库(可以在同一个物理数据库中,但出于扩展原因,最好不在其中),即域模型和读取模型。这些是非常不同的结构。域模型存储在任何具有第三范式的CRUD应用程序中。读取模型旨在通过自定义设计与视图所需数据匹配的表,使数据读取快速进行。这些表中会有大量重复数据。其思想是,为每个视图创建一个表,并在域模型更改时更新该表更具响应性,因为没有人坐在键盘旁等待视图渲染,因此视图模型数据生成可以花费更长的时间。这会导致一些CPU周期的浪费,因为您可以在任何人请求视图之前多次更新视图模型,但这没关系,因为我们实际上已经用完了空闲时间

    当命令更新聚合并将其持久化到DB时,它会为CQR的视图端生成一条消息以更新视图。有两种方法可以做到这一点。第一个是发送一条消息说“aggregate 83483需要更新”,视图模型从域模型中重新查询它需要的所有内容,并更新视图模型。另一种方法是发送一条消息,说明“aggregate 83483已更新为具有以下值:…”,并且读取端无需查询即可更新其表。第一种方法需要更少的消息类型,但需要更多的查询,而第二种方法恰恰相反。您可以在同一系统中混合并匹配这两种方法

    由于读取端具有非常不同的表结构,因此需要两个数据库。在读取端,除非您希望用户能够看到约会的旧版本,否则您只需存储视图的当前状态即可更新现有数据。在命令端,使用版本号保持历史状态是一个好主意,但会使数据库大小增加

    如果没有,主应用程序如何从查询服务调用数据 想休息吗

    请求如何到达查询端并不重要,因此您可以使用REST、回发、GraphQL或其他方法

    这是“事件来源”吗

    事件源是指持久化对所有实体所做的所有更改。如果整个