问题标签 [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.
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 中。
所以总结一下:
- Jonathan 的 EventStore 上线了吗?
- 如果是,我是否应该选择当前的官方 3.0 版本并单独参考 CommonDomain 项目?
- 3.1 分支(与 CommonDomain 合并)准备好了吗?
- 我到底应该切换到 Greg Young 的 EventStore 吗?
- 或者我应该调查 Lokad.CQRS?(我不认为它使用乔纳森的 EventStore)
PS。我不介意分叉 joliver 的 EventStore 并贡献修复/次要功能。
mongodb - MongoDB 可以成为一致的事件存储吗?
在事件存储中存储事件时,存储事件的顺序非常重要,尤其是在稍后投影事件以恢复实体当前状态时。
考虑到它的速度和灵活的模式(并且经常被推荐),MongoDB 似乎是持久化事件存储的一个不错的选择,但是 MongoDB 中没有事务之类的东西,这意味着无法保证正确的事件顺序。
鉴于这一事实,如果您正在寻找一致的事件存储,您应该不使用 MongoDB,而是坚持使用传统的 RDMS,还是有办法解决这个问题?
cqrs - 事件溯源:在更新模型之前或之后写入事件
我正在推理事件溯源,并且经常遇到先有鸡还是先有蛋的问题。将不胜感激有关如何对此进行推理的一些提示。
如果我执行所有 I/O 绑定处理异步(即写入事件日志),那么我如何处理,有时甚至检测失败?
我正在使用 Akka Actors,因此每个事件/消息的处理都是顺序的。我目前没有任何数据库,而是将所有事件保存在事件日志中,然后将所有事件的聚合状态保存在内存中的模型中。查询都是针对这个模型的,你可以认为它是一个缓存。
例子
创建新用户:
- 验证用户在模型中不存在
- 将事件持久化到日志
- 更新模型(在内存中)
如果第 3 步中断,我仍然坚持我的活动,以便以后重播。如果第 2 步中断,我也可以优雅地处理它。
这很好,但是由于第 2 步是 I/O 绑定的,我认为我应该在单独的参与者中执行 I/O 以释放第一个参与者进行查询:
在允许查询的同时更新用户(A0 = 前端/GUI 参与者,A1 = 处理器参与者,A2 = IO 参与者,E = 事件总线)。
- (A0->E->A1) 发布事件以更新用户“U1”。验证用户“U1”是否存在于模型中
- (A1->A2)将事件持久化到日志(单独的参与者)
- (A0->E->A1->A0) 查询用户 'U1' 个人资料
- (A2->A1) 事件现在持续更新模型
- (A0->E->A1->A0) 查询用户“U1”个人资料(现在返回新数据)
这很吸引人,因为查询可以在 I/O 以自己的节奏进行的同时进行处理。
但是现在我可以给自己造成各种问题,我可以将两个不兼容的命令(删除然后更新)持久化到事件日志中,并在以后重播时崩溃,因为我在持久化事件之前进行了验证然后更新模型。
我的目标是围绕我的模型进行简单的推理(因为 Actor 按单线程顺序处理消息),但在查询时不等待 I/O 绑定更新。我觉得我正在建模一个数据库,这本身可能是一个问题。
如果事情不清楚,请写评论。
unit-testing - CommonDomain - 如何对聚合根进行单元测试
我有一个使用 Jonathan Oliver 的CommonDomain和EventStore的小系统。
如何对聚合根进行单元测试以验证是否引发了正确的事件?
考虑以下聚合根:
我想写一个以下测试:
我可以使用内存持久性和同步调度程序设置整个 EventStore,连接模拟事件处理程序并存储任何已发布的事件以进行验证,但这似乎有点矫枉过正。
CommonDomain中有一个接口IRouteEvents
。看起来我可以模拟它以直接从中获取事件,AggregateBase
但我实际上如何将它传递给我的Subscriber
班级?我不想用与测试相关的代码“污染”我的领域。
domain-driven-design - CQRS + 事件溯源。更改聚合根历史记录
我有以下问题。给定。CQRS + EventSourcing 应用程序。这怎么可能改变历史中聚合根的状态?
例如,会计申请,会计想申请交易但日期已过。将存储在事件存储中的事件将具有比最近事件更早的日期,但该事件的序列号会更大。
存储库将通过按序列号对事件进行排序来恢复聚合根的状态。如果我们将拍摄过去日期的快照 - 我们将拥有没有此事件的聚合根。
我们当然可以将存储库的逻辑更改为按日期对事件进行排序,但是我们使用 CQRS 的外部框架,这是不可取的。
这种情况有一些优雅的解决方案吗?
transactions - CQRS:存储事件并发布它们 - 我如何以安全的方式执行此操作?
正如我在为什么 CQRS 存储库发布事件而不是事件存储中所学到的那样?发布事件是 CQRS 存储库的任务。到现在为止还挺好。
当然,存储事件和发布它们应该在一个事务中。从技术上讲,这意味着将一个(或多个)记录写入存储,并将一个(或多个)事件发布到消息总线。因此,一个简单的数据库事务是不够的,它应该是一个分布式的。
现在,不幸的是,许多 NoSQL 数据库(例如 MongoDB)不支持符合 ACID 的事务,更不用说在分布式事务中发生的可能性了。此外,还有不支持分布式事务的消息队列。
所以问题是:我该如何处理?
有推荐使用的模式吗?
domain-driven-design - CQRS/事件溯源,如何获得一致的数据来应用业务规则?
有时我正在使用 CQRS 模式和事件溯源开发一个小项目。我有一个结构性问题,我不知道要采取哪种解决方案来解决它。
想象一下下面的例子:一个命令被发送,其中包含银行客户存了一些钱的信息(DepositCommand)。在命令处理程序/实体/聚合(对讨论不重要)中,必须应用业务规则;如果客户是前 10% 的客户之一,并且账户中有更多资金,则可以赢得一些奖金。
问题是我如何才能获得最新、一致的数据,以了解客户在存款后是否处于前 10%。
- 我无法使用事件存储,因为无法进行这样的查询;
- 我不确定我是否可以使用读取模型,因为不是 100% 确定它是最新的。
如果您需要数据库中的数据来应用业务规则,您会怎么做?如果我不关注最新数据,我可能会将奖品授予两个不同的客户
期待听到您的意见。
cqrs - EventStore:学习如何使用
我正在尝试学习 EventStore,我喜欢这个概念,但是当我尝试在实践中应用时,我陷入了同一点。让我们看看代码:
关于这个的两个问题:
当一个应用程序在一些维护后启动时,我们如何以一种安全的方式为开始读取的事件添加书签?有模式可以使用吗?
一旦事件全部消耗完,循环就结束了……消息到达运行时间呢?我希望呼叫阻塞,直到一些新消息到达(当然需要在线程中处理)或有类似 BeginRead EndRead 的东西。
我是否必须绑定 ESB 来处理运行时事件,或者 EventSore 是否提供了一些工具来执行此操作?
我试着用一个例子更好地解释 假设聚合是一个金融投资组合,并且应用程序是一个向交易者显示该投资组合的应用程序。假设交易者连接到网络应用程序并查看他自己的投资组合。当前状态将是整个历史记录,因此我必须阅读大量记录才能重现该状态。我想这可以通过所谓的快照来完成,但谁负责创建它?什么时候应该选择创建聚合?怎么能猜出聚合的快照存在?对于运行时部分:用户一看到重建的投资组合状态,实时部分就开始运行。用户可以下订单,并且可以通过在市场上成功执行该订单来创建新头寸。基础设施如何更新投资组合?我会期待,但也许我完全错了,拥有相同的事件流是该新事件new long position的来源,否则我有两条路径处理同一聚合的状态。我想知道这是否是该策略应该如何运作的,即使我觉得拥有两个国家代理有点棘手,这可能会重叠。只是为了澄清我如何担心重叠:
- 我知道事件必须是幂等的,所以我知道无论如何它一定不是问题,
- 但是让我们考虑以下几点:
在流式传输事件以更新投资组合的状态之前,我订阅了事件总线。公共汽车上出现了一些“未平仓事件”:我必须处理它们,但由于尚未实现,投资组合可能未处于处理它的正确状态。即使我能够处理此类事件,我也会在阅读流时再次找到它们。
更阴险:我打开流并读取所有事件并创建一个状态。然后我订阅总线:总线上的一些消息发生在 steram 读取结束和订阅开始之间的中间:这些事件丢失并且聚合未处于正确状态。
请大家耐心等待,我的英语很差而且争论很棘手,希望我设法分享我的疑问:)
logging - 在 Wicket 中记录用户操作
我正在试验 Wicket 和事件溯源。我正在尝试记录用户操作,以便我们可以重放它们或将它们用于测试或演示目的。
你会推荐什么策略?
例如,我可以定义动作类并将它们放在 onsubmit 等中。或者覆盖检票口的所有“动作”组件,例如链接、按钮、文本字段。等等。
有什么好的建议吗?
distributed-computing - 在发布者上线后播种订阅者数据
假设我们有两个业务组件
- 用户管理
这拥有用户。当用户信息发生变化时,该组件会发布消息。例如“NewUserCreated”
- 出版物
处理与用户的通信。电子邮件、推文等。因此,该组件订阅了用户消息,并将该信息的子集存储在其自己的存储中。
问题
如果用户管理组件在发布组件之前上线会发生什么?Publications 如何获取现有用户的列表?它不应该知道用户管理组件如何存储其数据。