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

cqrs - Jonathan Oliver 的 EventStore 是否积极开发?

我正在启动一个将在 Windows Azure 上托管的新项目。我使用 RavenDb 作为后端,我想使用 CQRS 和事件源。

我阅读了关于 Jonathan 的 EventStore 的好评,它非常适合我的架构,因为它是一个薄层并且可以将 RavenDb 用作存储。现在,我注意到 3.0 版本(最新的官方版本)已经有一年了,而新的 3.1 版本还没有发布(分支中有一些活动)。我想选择 3.1 版本,因为它集成了 CommonDomain 项目,但我对分别引用 3.0 版和当前 CommonDomain 没有任何问题。

我只是想知道 EventStore 是否正在积极开发并会得到维护,尤其是在 Greg Young 发布了他的 EventStore (geteventstore.com) 之后。我有点不愿意去做,因为它具有自己的持久性和 AFAIK,我无法将我的事件存储在我的 RavenDb 中。

所以总结一下:

  1. Jonathan 的 EventStore 上线了吗?
  2. 如果是,我是否应该选择当前的官方 3.0 版本并单独参考 CommonDomain 项目?
  3. 3.1 分支(与 CommonDomain 合并)准备好了吗?
  4. 我到底应该切换到 Greg Young 的 EventStore 吗?
  5. 或者我应该调查 Lokad.CQRS?(我不认为它使用乔纳森的 EventStore)

PS。我不介意分叉 joliver 的 EventStore 并贡献修复/次要功能。

0 投票
1 回答
1344 浏览

mongodb - MongoDB 可以成为一致的事件存储吗?

在事件存储中存储事件时,存储事件的顺序非常重要,尤其是在稍后投影事件以恢复实体当前状态时。

考虑到它的速度和灵活的模式(并且经常被推荐),MongoDB 似乎是持久化事件存储的一个不错的选择,但是 MongoDB 中没有事务之类的东西,这意味着无法保证正确的事件顺序。

鉴于这一事实,如果您正在寻找一致的事件存储,您应该不使用 MongoDB,而是坚持使用传统的 RDMS,还是有办法解决这个问题?

0 投票
1 回答
618 浏览

cqrs - 事件溯源:在更新模型之前或之后写入事件

我正在推理事件溯源,并且经常遇到先有鸡还是先有蛋的问题。将不胜感激有关如何对此进行推理的一些提示。

如果我执行所有 I/O 绑定处理异步(即写入事件日志),那么我如何处理,有时甚至检测失败?

我正在使用 Akka Actors,因此每个事件/消息的处理都是顺序的。我目前没有任何数据库,而是将所有事件保存在事件日志中,然后将所有事件的聚合状态保存在内存中的模型中。查询都是针对这个模型的,你可以认为它是一个缓存。

例子

创建新用户:

  1. 验证用户在模型中不存在
  2. 将事件持久化到日志
  3. 更新模型(在内存中)

如果第 3 步中断,我仍然坚持我的活动,以便以后重播。如果第 2 步中断,我也可以优雅地处理它。

这很好,但是由于第 2 步是 I/O 绑定的,我认为我应该在单独的参与者中执行 I/O 以释放第一个参与者进行查询

在允许查询的同时更新用户(A0 = 前端/GUI 参与者,A1 = 处理器参与者,A2 = IO 参与者,E = 事件总线)。

  1. (A0->E->A1) 发布事件以更新用户“U1”。验证用户“U1”是否存在于模型中
  2. (A1->A2)将事件持久化到日志(单独的参与者)
  3. (A0->E->A1->A0) 查询用户 'U1' 个人资料
  4. (A2->A1) 事件现在持续更新模型
  5. (A0->E->A1->A0) 查询用户“U1”个人资料(现在返回新数据)

这很吸引人,因为查询可以在 I/O 以自己的节奏进行的同时进行处理。

但是现在我可以给自己造成各种问题,我可以将两个不兼容的命令(删除然后更新)持久化到事件日志中,并在以后重播时崩溃,因为我在持久化事件之前进行了验证然后更新模型。

我的目标是围绕我的模型进行简单的推理(因为 Actor 按单线程顺序处理消息),但在查询时不等待 I/O 绑定更新。我觉得我正在建模一个数据库,这本身可能是一个问题。

如果事情不清楚,请写评论。

0 投票
3 回答
1972 浏览

unit-testing - CommonDomain - 如何对聚合根进行单元测试

我有一个使用 Jonathan Oliver 的CommonDomainEventStore的小系统。

如何对聚合根进行单元测试以验证是否引发了正确的事件?

考虑以下聚合根:

我想写一个以下测试:

我可以使用内存持久性和同步调度程序设置整个 EventStore,连接模拟事件处理程序并存储任何已发布的事件以进行验证,但这似乎有点矫枉过正。

CommonDomain中有一个接口IRouteEvents。看起来我可以模拟它以直接从中获取事件,AggregateBase但我实际上如何将它传递给我的Subscriber班级?我不想用与测试相关的代码“污染”我的领域。

0 投票
5 回答
907 浏览

domain-driven-design - CQRS + 事件溯源。更改聚合根历史记录

我有以下问题。给定。CQRS + EventSourcing 应用程序。这怎么可能改变历史中聚合根的状态?

例如,会计申请,会计想申请交易但日期已过。将存储在事件存储中的事件将具有比最近事件更早的日期,但该事件的序列号会更大。

存储库将通过按序列号对事件进行排序来恢复聚合根的状态。如果我们将拍摄过去日期的快照 - 我们将拥有没有此事件的聚合根。

我们当然可以将存储库的逻辑更改为按日期对事件进行排序,但是我们使用 CQRS 的外部框架,这是不可取的。

这种情况有一些优雅的解决方案吗?

0 投票
1 回答
5316 浏览

transactions - CQRS:存储事件并发布它们 - 我如何以安全的方式执行此操作?

正如我在为什么 CQRS 存储库发布事件而不是事件存储中所学到的那样?发布事件是 CQRS 存储库的任务。到现在为止还挺好。

当然,存储事件和发布它们应该在一个事务中。从技术上讲,这意味着将一个(或多个)记录写入存储,并将一个(或多个)事件发布到消息总线。因此,一个简单的数据库事务是不够的,它应该是一个分布式的。

现在,不幸的是,许多 NoSQL 数据库(例如 MongoDB)不支持符合 ACID 的事务,更不用说在分布式事务中发生的可能性了。此外,还有不支持分布式事务的消息队列。

所以问题是:我该如何处理?

有推荐使用的模式吗?

0 投票
1 回答
2011 浏览

domain-driven-design - CQRS/事件溯源,如何获得一致的数据来应用业务规则?

有时我正在使用 CQRS 模式和事件溯源开发一个小项目。我有一个结构性问题,我不知道要采取哪种解决方案来解决它。

想象一下下面的例子:一个命令被发送,其中包含银行客户存了一些钱的信息(DepositCommand)。在命令处理程序/实体/聚合(对讨论不重要)中,必须应用业务规则;如果客户是前 10% 的客户之一,并且账户中有更多资金,则可以赢得一些奖金。

问题是我如何才能获得最新、一致的数据,以了解客户在存款后是否处于前 10%。

  • 我无法使用事件存储,因为无法进行这样的查询;
  • 我不确定我是否可以使用读取模型,因为不是 100% 确定它是最新的。

如果您需要数据库中的数据来应用业务规则,您会怎么做?如果我不关注最新数据,我可能会将奖品授予两个不同的客户

期待听到您的意见。

0 投票
1 回答
1538 浏览

cqrs - EventStore:学习如何使用

我正在尝试学习 EventStore,我喜欢这个概念,但是当我尝试在实践中应用时,我陷入了同一点。让我们看看代码:

关于这个的两个问题:

  • 当一个应用程序在一些维护后启动时,我们如何以一种安全的方式为开始读取的事件添加书签?有模式可以使用吗?

  • 一旦事件全部消耗完,循环就结束了……消息到达运行时间呢?我希望呼叫阻塞,直到一些新消息到达(当然需要在线程中处理)或有类似 BeginRead EndRead 的东西。

我是否必须绑定 ESB 来处理运行时事件,或者 EventSore 是否提供了一些工具来执行此操作?

我试着用一个例子更好地解释 假设聚合是一个金融投资组合,并且应用程序是一个向交易者显示该投资组合的应用程序。假设交易者连接到网络应用程序并查看他自己的投资组合。当前状态将是整个历史记录,因此我必须阅读大量记录才能重现该状态。我想这可以通过所谓的快照来完成,但谁负责创建它?什么时候应该选择创建聚合?怎么能猜出聚合的快照存在?对于运行时部分:用户一看到重建的投资组合状态,实时部分就开始运行。用户可以下订单,并且可以通过在市场上成功执行该订单来创建新头寸。基础设施如何更新投资组合?我会期待,但也许我完全错了,拥有相同的事件流是该新事件new long position的来源,否则我有两条路径处理同一聚合的状态。我想知道这是否是该策略应该如何运作的,即使我觉得拥有两个国家代理有点棘手,这可能会重叠。只是为了澄清我如何担心重叠:

  • 我知道事件必须是幂等的,所以我知道无论如何它一定不是问题,
  • 但是让我们考虑以下几点:

在流式传输事件以更新投资组合的状态之前,我订阅了事件总线。公共汽车上出现了一些“未平仓事件”:我必须处理它们,但由于尚未实现,投资组合可能未处于处理它的正确状态。即使我能够处理此类事件,我也会在阅读流时再次找到它们。

更阴险:我打开流并读取所有事件并创建一个状态。然后我订阅总线:总线上的一些消息发生在 steram 读取结束和订阅开始之间的中间:这些事件丢失并且聚合未处于正确状态。

请大家耐心等待,我的英语很差而且争论很棘手,希望我设法分享我的疑问:)

0 投票
4 回答
1172 浏览

logging - 在 Wicket 中记录用户操作

我正在试验 Wicket 和事件溯源。我正在尝试记录用户操作,以便我们可以重放它们或将它们用于测试或演示目的。

你会推荐什么策略?

例如,我可以定义动作类并将它们放在 onsubmit 等中。或者覆盖检票口的所有“动作”组件,例如链接、按钮、文本字段。等等。

有什么好的建议吗?

0 投票
3 回答
150 浏览

distributed-computing - 在发布者上线后播种订阅者数据

假设我们有两个业务组件

  1. 用户管理

这拥有用户。当用户信息发生变化时,该组件会发布消息。例如“NewUserCreated”

  1. 出版物

处理与用户的通信。电子邮件、推文等。因此,该组件订阅了用户消息,并将该信息的子集存储在其自己的存储中。

问题

如果用户管理组件在发布组件之前上线会发生什么?Publications 如何获取现有用户的列表?它不应该知道用户管理组件如何存储其数据。