问题标签 [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 回答
675 浏览

event-sourcing - NEventStore 配置 SQL 方言的问题

我正在研究原型 CQRS 实现并尝试将 Jonathan Oliver 的事件存储与 MS SQL 服务器一起使用:

我在 app.config 中定义了一个匹配的连接字符串:

我已经尝试了 SQL CE、本地 SQL、远程 SQL 服务器的连接字符串的变体,并且总是得到这个错误:

有没有人遇到过这个或者知道我做错了什么?我尝试单步执行源代码,但仍然不确定为什么会有空引用。-史蒂夫

0 投票
3 回答
10432 浏览

c# - 事件采购资源

寻找有关事件溯源主题的有用讨论组、文章、成功案例、参考应用程序和工具 (.Net) 的一些建议。

我已经熟悉:

福勒的文章:http ://martinfowler.com/eaaDev/EventSourcing.html

Greg Young 的文章(在评论中有下载的文档):http ://codebetter.com/gregyoung/2010/02/20/why-use-event-sourcing/

Greg Young 关于 DDDD 的优秀(草稿)文章:http: //abdullin.com/storage/uploads/2010/04/2010-04-16_DDDD_Drafts_by_Greg_Young.pdf

还有什么我应该阅读和看的吗?

0 投票
1 回答
630 浏览

cqrs - JOliver EventStore - 如何访问所有存储的事件?

如何访问EventStore 中存储的所有事件以重建我的读取模型?

问题J Oliver EventStore V2.0 questionsGetFrom中提到了一个调用的方法,但我在 Wireup 返回的接口“IStoreEvents”上找不到此方法。

0 投票
2 回答
621 浏览

gwt - GWT:如何测量客户端性能和发送到服务器的信息,以防处理大量数据以在客户端动态正确显示

我使用事件源的rpc,我需要将大量数据推送到客户端并测量性能并将信息发送回服务器端以根据测量的信息调整延迟时间(事件源rpc)。如何衡量客户绩效。如何在客户端制作缓冲区,以便在客户端可以流畅地显示数据(例如图形中的数组值(x,y)(x1,y1)......)并在其缓冲区中保存一些数据。

0 投票
2 回答
2202 浏览

c# - 使用 RavenDB 持久性插件连接 JOliver 的 EventStore

我正在评估JOliver 的 EventStore库。特别是,我正在尝试使用RavenDB作为 EventStore 的持久化引擎。EventStore 附带了一个插件。注意:数据库是空的,没有索引(默认索引除外)。

在连接商店时,我使用了以下内容:

但是,当我运行我的程序时,我得到一个异常,表明找不到“RavenCommitByRevisionRange”索引。

在挖掘 EventStore 代码时,我认为问题恰好是 RavenPersistenceEngine 没有被初始化。初始化代码在 RavenDB 服务器中安装所需的索引。

在 SQL Server 方面,我注意到示例项目中的接线代码显示了对名为“InitializeStorageEngine”的扩展方法的调用。此扩展方法与“PersistenceWireup”类相关联。但是,我用来连接 RavenDB 持久性的扩展方法返回类“Wireup”。所以我将部分连线代码包装在一个新的 PersistenceWireup 实例中,并且能够像这样调用“.InitializeStorageEngine()”:

这很好用!RavenDB 数据库现在包含必要的索引。

所以...我的问题:“.UsingRavenPersistence(...)”不应该返回“PersistenceWireup”的实例,而不仅仅是“Wireup”吗?或者有没有更好的方法在 EventStore 中连接 RavenDB 持久性?

0 投票
2 回答
1667 浏览

messaging - 在使用事件溯源的分布式系统中将事件存储在哪里?

假设您有多个由事件集成的系统,并且它们都使用事件溯源。你在哪里存储事件?

就我而言,我有三个系统:

  • 一个网站,一个商店
  • 网站的后端,用于管理客户、产品等。
  • 会计系统

每当在这些系统之一中发生域事件时,该事件就会被发布并且可以由其他系统处理。所有系统都使用事件溯源。

我想知道您将在哪里保存事件。当然,每个系统都必须存储它处理的所有事件,因为它使用事件源,因此依赖于它曾经处理过的事件。

但是对于其他不需要且因此系统没有订阅的事件呢?我正在努力解决需求可能会发生变化的事实,这样系统就必须处理过去没有持续存在的事件。如果系统需要处理发生时未订阅的事件,您将从哪里获得这些事件?

我认为此时不使用事件溯源的系统有很大的不同。如果您必须在系统 A 中实现依赖于数据的功能,该功能在 A 中不可用,但在另一个系统 B 中,并且您通过像 NHibernate 这样的 ORM 工具保持当前状态,您可以简单地将数据从 A 导入到 B . 由于使用事件溯源的系统依赖于事件来达到其当前状态,因此您必须导入过去错过但现在需要的所有事件。

对我来说,这个问题有几种不同的方法。

  1. 每个系统都保存所有发布的事件。这使您能够在需要时重新发布事件或将它们导入另一个系统。
  2. 每个系统都会保存所有发生的事件,即使是那些(还)不需要处理的事件。
  3. 来自所有系统的所有事件都存储在中央事件日志中。如果您需要处理过去发生但您没有订阅的事件,您可以从这里导入它。

你如何处理这样的情况?你在哪里保存你的事件?

编辑

感谢 Roy Dictus 的回答。我仍然不确定如何处理以下情况:

该网站发布事件 CustomerRegistered、CustomerPurchasedProduct 和 CustomerMarkedProductAsFavorite。在后端的当前版本中,必须显示客户并且必须显示他们的购买。客户标记为收藏的内容对该版本的系统不感兴趣。因此后端只订阅了 CustomerRegistered 和 CustomerPurchasedProduct。

现在营销部门还希望在客户详细信息页面上显示有关最喜欢的产品的信息。由于后端未订阅 CustomerMarkedProductAsFavorite,因此此信息在后端不​​可用。我从哪里得到这些信息?

0 投票
2 回答
2991 浏览

events - 事件对象应该被命名为过去时动词还是名词?

我一直在阅读几篇事件溯源文章和示例。我似乎有些是动词,有些是名词,两者都可能在结尾加上事件。哪个更正确?一个例子是。OrderShippedEvent(或者有时只是 OrderShipped)与 ShipOrderEvent。对这些类型的对象进行操作的方法的时态也没有多大帮助。以下是我找到的一些示例。

或者

在其他情况下会有处理程序,如

或者

我认为应该有一种标准方法来命名和处理任何上下文中的任何类型的事件,尽管我对事件溯源方案最感兴趣。

0 投票
3 回答
2236 浏览

cqrs - 将关系数据迁移到事件存储

我正在使用我自己的 CQRS 模式实现将一个旧项目迁移到 CQRS。我开始此迁移的主要原因是摆脱 n 层架构造成的混乱。然而,与许多其他项目一样,该项目正在使用关系数据存储。

此过程中的当前状态是我有进行更改的命令和隔离查询的查询对象。这意味着从客户端到服务器,我有一种 CQRS 式的更改和查询数据的方式,尽管我没有发布来自更改的任何事件,也没有非规范化的读取存储。我应该提一下,我的“领域模型”也有相当贫乏的 DTO。所有行为都分布在 n 层及其处理程序、管理器和所有那些可怕的层中。

我想知道我该如何迈出下一步。我现在想要的是开始构建一个负责其行为的域模型,其原因是我想开始使用事件存储作为事实来源,这让我想到了我的问题:

如何将数据从关系数据存储迁移到事件存储?

我有一个非常规范化的数据模型,其中包含非常重要的数据,必须迁移。我明白我不能指望从该数据中捕获任何意图,因为它已经死了,但我该怎么处理它呢?我应该创建大量迁移命令吗?很高兴听到您的经验。

0 投票
3 回答
1038 浏览

nhibernate - 使用 NHibernate 进行事件溯源

我正在从纯 DDD 范式转向 CQRS。我目前关心的是 Event Sourcing,更具体地说,是组织 Event Store。我已经阅读了大量的博客文章,但仍然无法理解某些内容。如果我错了,请纠正我。

每个事件基本上包括: - 事件日期/时间 - 事件类型(我们也可以从中找出 AggregateRoot 的类型) - AggregateRoot id (Guid) - AggregateRoot 版本(维护更新顺序) - 事件数据(一些具有更新所需数据的序列化类)

现在,如果我的事件数据由简单的值类型(整数、字符串、枚举等)组成,那么这很容易。但是如果我必须通过另一个 AggregateRoot 怎么办?我不能将整个 AR 序列化为事件数据的一部分(想想所有数据和延迟加载),基本上我只需要存储那个 AR 的 Id。但是,当我需要应用该事件时,我需要先从数据库中获取该 AR。而且从我的域模型(调用存储库和使用 AR Id)中这样做感觉不对。

最好的方法是什么?

ps 对于一个具体的例子,我们假设有一个模型,它由任务和用户实体(都是 AR)组成。任务持有对用户负责人的引用。但是可以更改负责的用户。

更新: 我想我找到了困惑的根源。我相信事件溯源应该只用于构建读取模型。在这种情况下,传递 ID 和原始数据是可以的。但是聚合本身使用的相同事件。这是我无法理解的。

0 投票
2 回答
6778 浏览

cqrs - 事件溯源命令与事件

我了解命令和事件之间的区别,但在很多情况下,您最终会在两个基本相同的类(ThingNameUpdateCommand、ThingNameUpdatedEvent)之间产生冗余和映射。对于这些简单的情况,您/您是否也可以将事件用作命令?人们是否将所有命令和所有事件都序列化到存储中?对我来说似乎有点多余。