- 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/
我正在使用 EventKit 的 EKEventStore,我想模拟它和 EKEvent。但是我不知道如何正确抽象EKEvent's init(eventStore: EKEventStore) 和其
我在我的应用程序中使用 EventStore,目前想部署在我们的一个产品环境中。当我在我的电脑上开发时,EventStore 启动时没有任何问题。当我想在我们的产品服务器上启动它时,问题就来了。 Ev
我正在尝试评估 EventStore就像服务器软件内部的可靠排队机制一样。 MSMQ 作为替代方案失败了,因为它不能支持部分排序,消息“对话”中的有序消息。并且由于它的 4MB 消息大小限制(可以
我已经开始在 .Net 中创建一个测试应用程序,它使用 Greg Young 的 EventStore 作为 CQRS/ES 的后备存储。 为了方便加载完整的聚合,我保存到一个名为“agg-123”的
我想问问您的意见,以及您认为使用 ElasticSearch 作为 EventStore 的利弊。 我想听听是否有人有使用 ElasticSearch 作为事件存储的经验,以及结果、可靠性以及是否存在
我已经关注 Event Store 一段时间了,困扰我的一件事是何时应该考虑编写投影?创建扁平投影是常见的做法吗? The setup here is using a stream per aggre
对于我的罪过,我负责存储个人身份信息和可能受 HIPAA 保护的数据的数据库。 因此,这些数据在传输过程中和静止时都需要加密存储。 我们目前使用 MSSQL Enterprise 和 TDE。 我们正
我们正在使用 axon 框架版本 3.4.2,并在我们的代码中发现了一个错误。该错误与未发布的缺失事件有关。解决方案是修复代码,但这不会修复事件存储和 View 。 我的问题是如何解决这个问题?我们考
我在看 2 个场景:A 没问题,B 不确定。 场景A:模拟提交后、分派(dispatch)前的应用程序重启 启动EventStore 提交更改 事件未发送 停止事件商店 启动事件存储 在第 5 步中再
如果我想根据存储在 ES 中的所有历史事件填充新的 Viewmodel,我该怎么做? 我可以看到 IPersistStreams.GetFrom(DateTime)但是一口气把它们全部搞定似乎有点吓人
任何人都可以解释为什么 EventStore 有 2 个实际版本(20.6.1 和 5.0.9)? 它们之间有什么区别? 我们应该为什么目标使用什么版本? 最佳答案 20.x 和 5.x 之间的主要区
也许这个问题很愚蠢,但我有点困惑。 假设我们想要利用这种模式: 企业应用程序中的事件存储范围究竟是什么? 事件存储是在多个进程之间共享,还是只是一个进程内概念? 当应用程序关闭时,事件会发生什么?它们
使用 JOliver EventStore 3.0 并从 NServiceBus 接收命令,处理并发异常的正确方法是什么?如果我有多个工作线程,这可能是一种常见的情况。 选项 1 try {
谁能给我指点EventStore带有源代码的示例应用程序? 我正在学习事件存储并想查看引用实现。 最佳答案 很多这样的东西似乎都缺乏功能齐全的示例项目。到目前为止,我发现的 EventStore/Co
顺便说一句,你如何创建一个流? I use AppendToStreamAsync directly, is this right or shall I create a stream first t
我目前正在开始使用 EventStore我正在关注 Getting Started指导。我只是卡在第一步,不知道我做错了什么...... 我现在使用的版本是 20.6.0 . 我正在尝试使用 .NET
如何访问 EventStore 中存储的所有事件以重建我的读取模型? 在问题 J Oliver EventStore V2.0 questions 中提到了一个名为 GetFrom 的方法,但我在 W
是否可以不通过 StreamId 而通过其他 Stream 属性来搜索流?例如,如果每个流的 header 中都有 CustomerId,我想搜索具有特定 CustomerId 的所有流。 最佳答案
我试图弄清楚我的事件存储和我的读取模型在实际具体实现方面是如何相关的。 我对事件存储的有限了解使我相信: 事件提交给事件存储 调度员运行 如果我使用队列,我会将消息发送到队列(比方说公共(public
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题吗? 更新问题,以便 editing this post 提供事实和引用来回答它. 关闭 6 年前。 Improve
我是一名优秀的程序员,十分优秀!