- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
第一次尝试实现事件源和CQRS,但在持久化聚合时陷入困境。
这就是我现在的位置
我已经将“ EventStore”设置为流,“ foos”
从node-eventstore-client
连接到它
我订阅追赶活动
一切都很好。
借助eventAppeared
事件处理程序功能,无论何时发生事件,我都可以构建聚合。很好,但是我该怎么办?
假设我建立并汇总了Foos列表
[
{
id: 'some aggregate uuidv5 made from barId and bazId',
barId: 'qwe',
bazId: 'rty',
isActive: true,
history: [
{
id: 'some event uuid',
data: {
isActive: true,
},
timestamp: 123456788,
eventType: 'IsActiveUpdated'
}
{
id: 'some event uuid',
data: {
barId: 'qwe',
bazId: 'rty',
},
timestamp: 123456789,
eventType: 'FooCreated'
}
]
}
]
rpc GetFoo(FooRequest) returns (Foo)
rpc GetFoos(FoosRequest) returns (FooResponse)
message FooRequest {
string id = 1; // uuid
}
// If the optional status field is not specified, return all foos
message FoosRequest {
// If this field is specified only return the Foos that has isActive true or false
FooStatus status = 1;
enum FooStatus {
UNKNOWN = 0;
ACTIVE = 1;
INACTIVE = 2;
}
}
message FoosResponse {
repeated Foo foos;
}
message Foo {
string id = 1; // uuid
string bar_id = 2 // uuid
string baz_id = 3 // uuid
boolean is_active = 4;
repeated Event history = 5;
google.protobuf.Timestamp last_updated = 6;
}
message Event {
string id = 1; // uuid
google.protobuf.Any data = 2;
google.protobuf.Timestamp timestamp = 3;
string eventType = 4;
}
{
id: 'some event uuid',
barId: 'qwe',
bazId: 'rty',
timestamp: 123456789,
eventType: 'FooCreated'
}
{
id: 'some event uuid',
isActive: true,
timestamp: 123456788,
eventType: 'IsActiveUpdated'
}
最佳答案
我知道你的感受!基本上这就是我第一次尝试进行CQRS和ES时发生的事情。
我认为您在知识上有一些差距,我相信您会很快弥补。您可以在执行操作时从事件流中添加聚合。那就是您的总和持续存在。读取模型有所不同。让我解释...
您的读取模型是您用来对之运行查询并提供数据以显示给UI的东西。您的聚合不(直接)参与其中。实际上,它们应该被封装。这意味着您无法从外部“看到”它们的状态。即没有getter和setter,但具有ID的聚合ID除外。
本文为您提供了有关如何将它们组合在一起的有用概述:CQRS + Event Sourcing – Step by Step
这个想法是,当一个聚合改变状态时,它只能通过它产生的一个事件来改变。您将该事件存储在事件存储中。该事件也会发布,以便可以更新读取的模型。
同时查看您的聚合,它看起来更像是典型的读取模型对象或DTO。聚合对功能而不是属性感兴趣。因此,您会期望看到无效的公共功能,无法向集合发出命令。但不是像isActive或history这样的公共属性。
我希望这是有道理的。
编辑:
这里有一些更实用的建议。
“为了遵循CQRS,我将在读取模型中构建以上汇总,对吗?”
您没有在读取模型中构建聚合。它们是等式的CQRS侧的不同侧的独立事物。聚合位于命令端。针对与聚合不同的读取模型进行查询。
集合具有公共无效函数,没有getter或setter(集合ID除外)。它们被封装。当状态由于发出命令而改变时,它们将生成事件。这些事件存储在事件存储中,并用于恢复聚合的状态。换句话说,这就是聚合的存储方式。
事件继续被发布,因此事件处理程序和其他进程可以对它们做出反应并更新读取模型和/或触发新的级联命令。
“最后一个问题。目前,我仅使用单个流“ foos”,但是在这个级别上,我希望新事件会非常频繁地发生(每隔几秒钟左右),但是据我了解,您仍然会坚持下去,并且使用实例化视图更新它,对吗?”
每两秒钟很可能就好了。我更关注使用物化视图的持久性和更新。我不知道您的意思是什么,但这听起来不像您有正确的主意。视图应该是非常简单的读取模型。无需像在RDMS中发现的那样复杂的关系。因此,经过高度优化,可以快速读取。
关于cqrs - 如何从数据库“EventStore”中持久保存聚合/读取模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60755360/
我了解了 CQRS 的一般概念,但是当涉及到超越示例代码和幻灯片以处理现实世界问题时,我有一些问题。 验证 当您需要对涉及检查数据库值的命令进行验证时,您会怎么做? 注册一项服务,我必须输入一个唯一的
我目前正在尝试了解如何构建事件存储的内部结构。到目前为止我得到了什么: 一个事件存储有两个表(集合,...),一个用于聚合,一个用于事件。 聚合表包含以下数据:aggregateId (可能是一个 G
我最近阅读了很多关于 CQRS 的文章,对我来说,它似乎与 Event Sourcing 密切相关。 但就像这个答案说的https://stackoverflow.com/a/9217461/2770
我有 CQRS+ES 设计的应用程序。这是我在过去一年里一直在 CQRS+ES 世界中阅读的新内容,它非常有意义,但实现完美的意义并不总是那么容易。 无论如何,我的一个或多个问题是: 包含多个命令(步
我想知道如何在 CQRS 中创建多个聚合根。 示例:我有一个手机聚合根和 Simcard 聚合根。身份证 这些聚合应该是订阅聚合根的一部分。 我需要创建一个基于 SimCard 的订阅聚合,并且系统中
用户在我们的站点上注册并登录。RegisterUserCommand 被发送到异步命令处理程序。 用户想要更改他们的地址,但 RegisterUserCommand 尚未处理。系统中没有用户记录。 这
事件溯源和 CQRS 很棒,因为它使开发人员摆脱了一个预先建模的数据库的困扰,除非有大数据迁移项目,否则开发人员必须在应用程序的整个生命周期中使用该数据库。 CQRS 和 ES 还具有其他好处,例如扩
我想我理解了 ES + CQRS 上下文中读取模型的思想(如果不正确请指正)。然而,我对在“严肃”报道的背景下使用它仍有一些疑问。假设我使用关系数据库和一些 ORM 来处理我的读取模型。一个基本的“摘
我正在使用 Akka 持久性实现 CQRS 系统,并且我正在尝试了解 CQRS 的请求响应位。 关于如何将响应发送回客户端和 this article 的答案很少。还提到了一些不错的模式。但是,不是使
在基于 CQRS/ES 的系统中,您将事件存储在事件存储中。这些事件涉及一个聚合,并且它们相对于它们所属的聚合有一个顺序。此外,聚合是一致性/事务边界,这意味着任何事务保证仅在每个聚合级别上给出。 现
根据CQRS à la Greg Young ,事件处理程序(和下游事件反规范化器)对事件发布者之前发布的传入事件使用react。 现在让我们假设在运行时我们想要添加一个新的事件反规范化器:基本上,这
是否存在单个命令导致 CQRS 中有多个事件的情况?任何人都可以举一个例子吗? 我问是因为聚合是事务边界,编写聚合的实现取决于这个问题的答案。 最佳答案 是的,例如考虑命令 AssignUserToG
大概我们可以通过应用相同的命令集来恢复状态,那么为什么不简单地存储命令而不是事件呢? 最佳答案 事件,传达“这发生在我们的系统中”。当一个命令被接受和处理时,事件就会发生。没有人可以拒绝或改变它发生的
我正在学习什么是CQRS模式,并了解到还有CQS模式。 当我尝试搜索时,我发现了很多关于CQRS的图表和信息,但没有找到太多关于CQS的信息。 CQRS 模式中的关键点 在 CQRS 中,有一种要写入
我的CQRS / ES设计中有时间问题。为了便于讨论,让我们基于Microsoft的 有关此主题的示例, session 管理(https://msdn.microsoft.com/en-us/lib
我只是想知道我将尝试实现的设计是否有效 CQRS。 我将有一个查询处理程序,它本身会向其他子处理程序发送更多查询。它的主要任务是聚合来自多个服务的结果。 从处理程序内部发送查询可以吗?我已经可以在我的
我第一次尝试使用 CQRS 和事件溯源,我有几点需要一些指导。我想实现一个 SO 风格的声誉系统。这似乎非常适合这种架构。 以 SO 为例。假设一个问题被投票,这会生成一个 UpvoteCommand
我的问题与this one有关.虽然相关的问题和答案说明了我们为什么要将它们分开,但我想确保我对意图的理解是正确的。在我见过的所有示例中,命令的意图似乎是它可以被拒绝,并且它更新内存中的对象,然后事件
这更像是一个与 CQRS 和 Axon 相关的理论问题。下面是一个不言自明的设置,代码是 伪代码 ,它并不意味着编译。 假设为了处理来自聚合“Foo”的命令,我们首先需要查询另一个聚合“Bar”的状态
亲们,我正在考虑将 Dapper.net 等 microORM 用于 CQRS 应用程序 (Asp.Net MVC) 的读取访问组件,并使用 Entity Framework 来操作域。 这是 CQR
我是一名优秀的程序员,十分优秀!