问题标签 [event-sourcing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
187 浏览

c# - 使用 EventSourcing 确认 MessageBox?

在 CQRS 中,事件源是我们唯一真正的信息来源,永远不要相信您读取的数据模型,那么如果我需要显示一个确认消息框,其中显示例如“用户 X 的最后 10 次操作”,那么我应该使用什么方法?

1 - 发送一个命令来查询我的聚合的最后 10 个操作,然后聚合发布我在 UI 中处理的包含用户操作的 10 个事件?

2 - 或者简单地说,查询我的读取模型?

CQRS 在我的情况下怎么说?

多谢你们。

约翰·史密斯

0 投票
1 回答
342 浏览

cqrs - JOliver 的 EventStore:使用 ServiceStack 序列化程序时无法读取事件

使用 ServiceStack 时,EventMessage.Body 不会反序列化回原始对象。相反 EventMessage.Body 是一个 JSON 字符串。

重现:

  1. 打开 EventStore 项目并导航到 EventStore.Example 项目
  2. 将 EventStore.Serialization.Json 引用替换为对 EventStore.Serialization.ServiceStack 的项目引用
  3. 关闭 EventStore.Example 项目上的程序集签名
  4. 将 MainProgram.WireupEventStore 更改为 .UsingServiceStackJsonSerialization()
  5. 在 MainProgram.Main() 的末尾附近添加以下代码:

-

0 投票
6 回答
42990 浏览

cqrs - 使用 RDBMS 作为事件源存储

如果我使用 RDBMS(例如 SQL Server)来存储事件溯源数据,架构会是什么样子?

我已经看到了一些抽象意义上的变体,但没有具体的。

例如,假设有一个“产品”实体,对该产品的更改可能以以下形式出现:价格、成本和描述。我很困惑我是否会:

  1. 有一个“ProductEvent”表,其中包含产品的所有字段,其中每个更改都意味着该表中的新记录,以及适当的“谁、什么、在哪里、为什么、何时以及如何”(WWWWWH)。当成本、价格或描述发生变化时,会添加一个全新的行来表示产品。
  2. 将产品成本、价格和描述存储在使用外键关系连接到产品表的单独表中。当这些属性发生更改时,请酌情使用 WWWWWH 写入新行。
  3. 将 WWWWWH 以及表示事件的序列化对象存储在“ProductEvent”表中,这意味着必须在我的应用程序代码中加载、反序列化和重新播放事件本身,以便为给定产品重新构建应用程序状态.

特别是我担心上面的选项2。极端情况下,产品表几乎是每个属性一个表,在哪里加载给定产品的应用程序状态将需要从每个产品事件表中加载该产品的所有事件。这种桌子爆炸对我来说是错误的。

我确信“这取决于”,虽然没有单一的“正确答案”,但我试图了解什么是可以接受的,什么是完全不可接受的。我也知道 NoSQL 在这里可以提供帮助,其中可以针对聚合根存储事件,这意味着只需向数据库发出一个请求即可获取从中重建对象的事件,但我们没有使用 NoSQL 数据库时刻,所以我正在寻找替代方案。

0 投票
1 回答
513 浏览

cqrs - 如何使用 EventStore 在 praxis 中构建新的应用程序视图?

是的,之前至少有人问过类似的问题。因此我知道答案:您只需在新处理程序上重播事件,很简单。但是尝试实际实施会引发一些问题。

我正在使用 JOlivier 的 EventStore,它看起来不错。对于初学者,我将忽略 SnapShots 的概念,而只是寻找一种方法来获取我的事件。我能做的就是这段代码:

这里的第一个问题当然是:这是这样做的方式吗?我在使用“GetFrom”参数时遇到问题,因为它只是一个 DateTime,我不能确定所有服务器在时间上都是同步的。如果一台服务器上的时钟比另一台服务器晚 1 分钟怎么办?还是½小时?我也在使用 NServiceBus,所以新的处理程序队列会从某个时间点开始堆积事件 - 但我怎么能 100% 确定这里没有 10 秒丢失?请告诉我如何在 100%(不是 99%)确保新应用程序视图在启动时完全同步的同时从 EventStore 中获取事件。

另外:您是否在代码中创建了特殊的导入方法?我的意思是,假设我的新应用程序中的处理程序在处理“SomeDomainEvent”时发送了一封电子邮件。我不希望它为所有 10.000 个旧事件发送电子邮件。您如何在实践/代码中执行此“导入”?

0 投票
4 回答
1287 浏览

cqrs - 如何使用 JOliviers 的 CommonDomain 和 EventStore 获取聚合列表?

CommonDomain 中的存储库仅公开“GetById()”。那么,如果我的处理程序需要一个客户列表,例如,该怎么办?

0 投票
1 回答
729 浏览

nservicebus - 如何在 CommonDomain 和 NEventStore 中使用接口作为事件?

我正在使用带有 NServiceBus 的JOlivers CommonDomain 和 EventStore 进行测试。我需要像这样在我的聚合中引发一个事件:

然后我有这个处理程序:

不幸的是,这不起作用。我收到一个异常:“CommonDomain.Core.HandlerForDomainEventNotFoundException:'Phone' 类型的聚合引发了 'IPhoneNumberChanged' 类型的事件,但找不到处理程序来处理消息。”。

这里的问题是从“bus.CreateInstance”创建的对象,因为它适用于纯具体的类。但我需要我的事件作为接口。这可以解决吗?

编辑:请注意 - 我不必使用“bus.CreateInstance”来创建对象,这只是我目前必须提高“IPhoneNumberChanged”的最简单(唯一)的方法。任何其他方式也很好——只要我在处理程序中有一个接口作为参数。

0 投票
3 回答
4456 浏览

domain-driven-design - 事件溯源:触发其他事件和重建状态的事件

通过重放 EventStore 中的事件,特别是当事件可能触发其他事件发生时,我正在努力弄清楚在重建模型时应该发生什么。

例如,应该将购买了 10 次的用户提升为首选客户,并收到一封电子邮件,向他们提供某些促销活动。

我们显然不希望每次为该用户重建模型时都发送电子邮件,但是当我们重播第 10 次时如何阻止这种情况发生PurchaseMadeEvent

0 投票
2 回答
190 浏览

cqrs - 运行旧 NSB 的 NES(.NET 事件源)好吗?

我们有一个运行 NSB 2.0 的旧安装。我知道 NES 是为 2.5 发布的,但由于它只是顶层的一个层,我认为应该可以尝试 NES 与 NSB 2.0。此外,由于各种原因,客户不想升级 NSB,直到它达到 3.0。所以我正在为这个特定的客户评估使用 NES,它似乎可以编译和启动示例。

但是是否有任何令人信服的理由不将 NES 与 NSB 2.0 一起使用?

维尔纳

0 投票
4 回答
585 浏览

cqrs - 带有 CQRS 和事件溯源的 SO 风格声誉系统

我正在第一次尝试使用 CQRS 和事件溯源,我有几点我想要一些指导。我想实现一个 SO 风格的声誉系统。这似乎非常适合这种架构。

以 SO 为例。假设一个问题被投票,这会产生一个UpvoteCommand增加问题总分的问题并触发一个QuestionUpvotedEvent

似乎作者的用户聚合应该订阅QuestionUpvotedEvent可以增加信誉分数的。但是我不清楚您如何/何时进行此订阅?在 Greg Youngs 示例中,事件/命令处理连接在 global.asax 中,但这似乎不涉及任何基于聚合 Id 的路由。

似乎每个用户聚合都会订阅每个QuestionUpvotedEvent看起来不正确的信息,为了使这样的方案工作,事件处理程序必须表现出行为来识别该用户是否拥有刚刚被投票的问题。Greg Young 暗示这不应该出现在事件处理程序代码中,它应该只涉及状态更改。

我在这里做错了什么?

非常感谢任何指导。

编辑

我想我们在这里谈论的是问题和用户聚合之间的聚合间通信。我可以看到的一个解决方案是QuestionUpvotedEvent由 a 订阅,ReputationEventHandler然后可以获取相应的用户 AR 并在该对象上调用相应的方法,例如YourQuestionWasUpvoted. 这将反过来生成用户特定的UserQuestionUpvoted事件,从而在未来保留重播能力。这是朝着正确的方向前进吗?

编辑 2

另请参阅此处关于 google 群组的讨论。

0 投票
1 回答
444 浏览

cqrs - NES(.NET 事件源)示例异常(使用 NServiceBus 2.0)

我正在使用开箱即用的 NES 示例。然后我将 NServiceBus 2.5 版本与旧的 2.0 交换,但这会在启动 MVC 应用程序时导致以下错误:

“你调用的对象是空的。” 在 NES.EventConverterFactory..ctor( ) 在 C:\Users\werner\Downloads\elliotritchie-NES-9a56ad8\elliotritchie-NES-9a56ad8\src\NES\DI 中的 NES.DI.<.cctor>b_6()。 c:\Users\werner\Downloads\elliotritchie-NES-9a56ad8\elliotritchie-NES-9a56ad8\src\NES\DependencyInjectionContainer.cs 中的 NES.DependencyInjectionContainer.ResolveTService 第 24 行:NES.DependencyInjectionContainer.<>c 中的第 20 行_DisplayClass4 2.<Register>b__3() in C:\Users\werner\Downloads\elliotritchie-NES-9a56ad8\elliotritchie-NES-9a56ad8\src\NES\DependencyInjectionContainer.cs:line 45 at NES.DependencyInjectionContainer.Resolve[TService]() in C:\Users\werner\Downloads\elliotritchie-NES-9a56ad8\elliotritchie-NES-9a56ad8\src\NES\DependencyInjectionContainer.cs:line 20 at NES.DependencyInjectionContainer.<>c__DisplayClassa4.b_C:\Users\werner\Downloads\elliotritchie-NES-9a56ad8\elliotritchie-NES-9a56ad8\src\NES\DependencyInjectionContainer.cs 中的 9():第 59 行 NES.DependencyInjectionContainer.ResolveTService 在 C:\Users\werner\Downloads \elliotritchie-NES-9a56ad8\elliotritchie-NES-9a56ad8\src\NES\DependencyInjectionContainer.cs:NES.DependencyInjectionContainer 的第 20 行。<>c_DisplayClass4`2.b__3() 在 C:\Users\werner\Downloads\elliotritchie-NES-9a56ad8\elliotritchie-NES-9a56ad8\src\NES\DependencyInjectionContainer.cs:第 45 行 NES.DependencyInjectionContainer.ResolveTService 在 C:\Users \werner\Downloads\elliotritchie-NES-9a56ad8\elliotritchie-NES-9a56ad8\src\NES\DependencyInjectionContainer.cs:第 20 行 NES.UnitOfWorkFactory.Begin() 在 C:\Users\werner\Downloads\elliotritchie-NES-9a56ad8 \elliotritchie-NES-9a56ad8\src\NES\UnitOfWorkFactory.cs:第 18 行 NES.NServiceBus.MessageModule.HandleBeginMessage() 在 C:\Users\werner\Downloads\elliotritchie-NES-9a56ad8\elliotritchie-NES-9a56ad8\src \NES\NServiceBus\MessageModule.cs:第 10 行在 NServiceBus.Unicast.UnicastBus.TransportStartedMessageProcessing(Object sender, EventArgs e) 在 NServiceBus.Unicast.Transport.Msmq.MsmqTransport。ReceiveFromQueue() 在 NServiceBus.Unicast.Transport.Msmq.MsmqTransport.Process()

现在,当 Global.asax.cs 点击“AreaRegistration.RegisterAllAreas();”时就会发生这种情况。最后,错误发生在“EventConverterFactory.cs”第 13 行,其中静态构造函数尝试迭代为空的“Global.TypesToScan”。

有谁知道如何得到这个样本?奇怪的是完全相同的代码似乎适用于 NSB 2.5 程序集......

维尔纳