问题标签 [neventstore]
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.
unit-testing - CommonDomain - 如何对聚合根进行单元测试
我有一个使用 Jonathan Oliver 的CommonDomain和EventStore的小系统。
如何对聚合根进行单元测试以验证是否引发了正确的事件?
考虑以下聚合根:
我想写一个以下测试:
我可以使用内存持久性和同步调度程序设置整个 EventStore,连接模拟事件处理程序并存储任何已发布的事件以进行验证,但这似乎有点矫枉过正。
CommonDomain中有一个接口IRouteEvents
。看起来我可以模拟它以直接从中获取事件,AggregateBase
但我实际上如何将它传递给我的Subscriber
班级?我不想用与测试相关的代码“污染”我的领域。
transactions - CQRS:存储事件并发布它们 - 我如何以安全的方式执行此操作?
正如我在为什么 CQRS 存储库发布事件而不是事件存储中所学到的那样?发布事件是 CQRS 存储库的任务。到现在为止还挺好。
当然,存储事件和发布它们应该在一个事务中。从技术上讲,这意味着将一个(或多个)记录写入存储,并将一个(或多个)事件发布到消息总线。因此,一个简单的数据库事务是不够的,它应该是一个分布式的。
现在,不幸的是,许多 NoSQL 数据库(例如 MongoDB)不支持符合 ACID 的事务,更不用说在分布式事务中发生的可能性了。此外,还有不支持分布式事务的消息队列。
所以问题是:我该如何处理?
有推荐使用的模式吗?
design-patterns - EventStore 和应用程序生命周期
也许这个问题很愚蠢,但我有点困惑。假设我们想要利用这种模式:
企业应用程序中的事件存储范围究竟是什么?
事件存储是在多个进程之间共享,还是只是一个进程内概念?
当应用程序关闭时,事件会发生什么?它们是绑定到应用程序“实例”还是应用程序?
事件存储和带有 Publisher/Subscriber 的 MessageBus 之间有什么区别(我们可以存储消息历史的事实的一部分?
谁负责消息的幂等性?
- 这句话的实际含义是什么:“有趣的是,即使不存在跨所涉及的各种资源(例如消息队列和持久存储)的分布式事务,EventStore 也能够确保完全事务性的体验。这是通过拆分来实现的将分布式事务分成更小的部分并单独执行每个事务”(来自这个项目)我无法理解如何将事务分成几个小部分,即使所有事务本身都是事务性的,也可以替换分布式事务。
cqrs - EventStore:学习如何使用
我正在尝试学习 EventStore,我喜欢这个概念,但是当我尝试在实践中应用时,我陷入了同一点。让我们看看代码:
关于这个的两个问题:
当一个应用程序在一些维护后启动时,我们如何以一种安全的方式为开始读取的事件添加书签?有模式可以使用吗?
一旦事件全部消耗完,循环就结束了……消息到达运行时间呢?我希望呼叫阻塞,直到一些新消息到达(当然需要在线程中处理)或有类似 BeginRead EndRead 的东西。
我是否必须绑定 ESB 来处理运行时事件,或者 EventSore 是否提供了一些工具来执行此操作?
我试着用一个例子更好地解释 假设聚合是一个金融投资组合,并且应用程序是一个向交易者显示该投资组合的应用程序。假设交易者连接到网络应用程序并查看他自己的投资组合。当前状态将是整个历史记录,因此我必须阅读大量记录才能重现该状态。我想这可以通过所谓的快照来完成,但谁负责创建它?什么时候应该选择创建聚合?怎么能猜出聚合的快照存在?对于运行时部分:用户一看到重建的投资组合状态,实时部分就开始运行。用户可以下订单,并且可以通过在市场上成功执行该订单来创建新头寸。基础设施如何更新投资组合?我会期待,但也许我完全错了,拥有相同的事件流是该新事件new long position的来源,否则我有两条路径处理同一聚合的状态。我想知道这是否是该策略应该如何运作的,即使我觉得拥有两个国家代理有点棘手,这可能会重叠。只是为了澄清我如何担心重叠:
- 我知道事件必须是幂等的,所以我知道无论如何它一定不是问题,
- 但是让我们考虑以下几点:
在流式传输事件以更新投资组合的状态之前,我订阅了事件总线。公共汽车上出现了一些“未平仓事件”:我必须处理它们,但由于尚未实现,投资组合可能未处于处理它的正确状态。即使我能够处理此类事件,我也会在阅读流时再次找到它们。
更阴险:我打开流并读取所有事件并创建一个状态。然后我订阅总线:总线上的一些消息发生在 steram 读取结束和订阅开始之间的中间:这些事件丢失并且聚合未处于正确状态。
请大家耐心等待,我的英语很差而且争论很棘手,希望我设法分享我的疑问:)
neventstore - Jonathan Oliver 的 EventStore 查询和预测
在 Jonathan Oliver 关于他的 EventStore 实现的 screecast 演示中,他提到了查询事件的能力,例如进行复杂的时间查询。据我了解,这是通过在更新事件存储后更新读取模型或创建投影来完成的 - 但是我似乎看不到任何使用 JO 实现的示例。任何链接或示例都会很棒!
cqrs - 两个用户在 NEventStore 的同一个聚合根上工作
我知道命令不应该失败,所以我需要在发送命令之前验证我的命令。
但是,如果两个用户正在更新同一个聚合根并且两者似乎都是有效的,那么我们就会遇到并发问题。
我如何在 NEventStore 中处理这个问题?我的客户是否需要获取他们在保存事件时传递的版本号或提交 ID,如果它已更改,那么我会引发异常?
ravendb - EventStore 在使用 RavenDB 时抛出 ConcurrencyException
我的电线看起来像这样。
当我尝试保存事件时,如下所示:
它抛出一个EventStore.ConcurrencyException
我正在使用 eventstore 3.0 和 RavenDB 2.0
我究竟做错了什么?
这是堆栈跟踪:
domain-driven-design - DDD:继承和事务
我正在尝试领域驱动设计和事件溯源。我打算使用(用 C# 开发)NServiceBus、JOliver 的 EventStore 和 NES 来绑定它们。我已经拥有适用于一个简单案例的基础架构(一个仅包含值对象的聚合根)。
我正在阅读 Evans 蓝皮书,并且正在尝试开发一个简单的域模型,其中的示例取自我的工作领域(HVAC 维护公司的 ERP 和 CRM)。
我正在建模一个简单的子域,即 HVAC 机器和它们之间的关系。机器有多种类型,例如熔炉、燃烧器、空调、压缩机、通用组件。每台机器可以有多个子机器。所有机器类型都有一些共同的数据和一些共同的行为。但是每种类型都有额外的数据和特定的行为,例如,您只能将 Burner 对象添加到 Furnace。
我分析的第一个结果是每台机器都应该是一个聚合根(继承自 NES 中的 AggregateBase),因为它必须能够保存对特定机器的引用(例如,用于插入涉及单台机器的维修记录、故障记录、等),并且还可以减少大型机器树中的并发问题。
因此,我的假设如下:
但我有一些疑问:
这是代表我的域的正确方法吗?我读到不鼓励类继承,但这在我看来是使用它的完美案例(燃烧器是机器,炉子也是)。我将仅限于一级继承。
是否可以使用 Event Sourcing 实现类继承?特别是建议的技术堆栈(nServiceBus、EventStore、NES)?
我应该如何执行添加子机器(例如燃烧器到炉子)?这个操作可以分为两种:
- 将新的 Burner 添加到 Burner 存储库。
- 将 Burner 的引用添加到父 Furnace 的 burners 列表但是这两个操作全局修改了两个聚合根,因此该操作应该在两个单独的 commandhandlers/transactions 中执行...但是第二个取决于第一个...是这是一些建模错误的证据吗?我可以将 nServicebusMessages 批处理在一起以在单个事务中执行操作,但我读到这不好......
如果我让子机器引用父机器,则父机器会丢失子机器列表(验证所需的),我无法查询事件源存储库以获取除 Guid 之外的其他属性。
提前感谢您对讨论的任何贡献,
c# - joliver / EventStore 最终一致性
我试图弄清楚我的事件存储和我的读取模型在实际的具体实现方面是如何相关的。
我对事件存储的有限了解使我相信:
- 事件提交到事件存储
- 调度程序运行
- 如果我使用队列,我将消息发送到队列(比如说公共交通)
- 我的读取模型订阅了队列,所以我的读取数据库得到了消息(mysql)
- 我的读取模型已更新为我的数据的新更改
这意味着如果公共交通发生任何事情,我的读取数据库将不同步,我必须弄清楚如何将其同步回来。
我读过/看过的一些由 greg Young 发表的东西建议使用事件存储本身作为队列,并通过在事件存储端保持一个自动增量编号来保持一致性,以保持最终的一致性。我想知道这是否在joliver的项目中实施?
cqrs - EventStore 提交错误
我在 Jonathon Oliver 的 EventStore 中看到以下错误:
错误:23505:重复键值违反唯一约束“ix_commits_revisions”
任何想法为什么会发生这种情况?