问题标签 [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.
cqrs - 开发工作流程、重构和工具
当使用经典的“当前状态”持久性时,我们可能会向实体添加一个新属性。例如,使用博客有很多帖子的场景,我们可能会为帖子实体添加一个“评级”属性。我们希望将 Rating 值默认为 3,因此当我们在 DB 中添加一列时,默认值设置为 3。
在 CQRS 中,我读到处理此问题的一种策略是在构造函数中设置默认值 (Rating = 3),因此当从事件重放时,默认值将可用,除非有显式事件更改评级值。这对我来说似乎不是一个很好的解决方案,因为没有创建事件,因此读取模型(或其他流程管理器/BC)不会考虑默认值。(这里可能错了吗?)
因此,当将新属性添加到聚合时,应该在该聚合类型的每个“实例”上发出命令,设置默认值,从而创建所需的事件,这似乎是合乎逻辑的 - 因此读取模型被更新和其他processes / BCs 可以消费和处理事件。也许我在这方面做得很差?
我没有找到很多关于 NEventStore 工具的信息,所以我想知道正在使用什么策略?
我能想到的一种策略是,需要为每个“发布”创建一个一次性的可执行文件/脚本,它将:
- 获取给定类型的所有聚合的列表
- 在每个实例上执行命令,为新属性设置默认值,从而创建更新读取模型所需的事件
另一种策略可能是在读取模型被重构以包含新属性时在读取模型中设置默认值。但是,这对可能想要了解默认值的其他进程或 BC 没有帮助。
如果可以为给定聚合类型的所有流“制造”事件,那么通用工具会很棒。
其他人使用什么策略来处理对域的此类更改?
关于#1 - 我不相信 EventStore 中有 GetAllStreams< TAggregate> 功能,或者无论如何将 StreamId 映射到聚合类型,所以我看到获取给定类型的所有聚合(流 ID)的唯一方法是从读取模型查询?。如果要创建一个“通用工具”来帮助解决这个问题,那么该工具将需要了解读取模型模式才能获得流 ID 列表,这将使其不那么“通用”
events - 用于 CQRS 事件发布设置的 NServiceBus
我们目前正在建立一个基于 CQRS 的项目。每个 Web 项目实例都运行 NEventStore,但都共享相同的 EventStore 持久性(基础数据库)。
现在我们要发布存储的事件:不仅发布到我们的 ReadModel(每个 Web 项目实例一个),还发布到其他事件消费者(例如遗留应用程序,它们也需要以某种方式从我们的系统中获知事件,以及许多更多的)。
因此,我们有 x 个事件消费者(= 事件处理程序)和 y 个事件发布者,但只有一个“真正的事件源”(底层 EventStore 数据库)。
Q1:现在有通过发布/订阅连接这些系统的最佳实践吗?
我们考虑通过 NServiceBus 从 EventStore 发布事件。所有消费者都应该订阅他们需要的事件类型 - 因此每个消费者还需要订阅可能不止一个发布者 - Q2:这甚至可能吗?我们了解到您不能在多个位置订阅同一事件,请参阅:David Boike “一旦您在 QueueName@WebServer1 订阅 Message1,您将无法订阅来自 QueueName@WebServer2 的 Message1。”
其他未解决的问题: Q3:如何检测消费者已永久关闭(如果它没有成功从总线退订)。-> 队列满了?!如何将此与仅丢失网络连接的情况区分开来?
Q4:订阅服务和EventStore的连接不可靠,失败了怎么办?消费者在订阅服务上注册成功,但 EventStore 不知道新订阅,也不传递消息......
Q5:一般来说:NServiceBus 是如何处理队列的?当消费者长时间(例如几天)无法联系到时会发生什么?
mongodb - MongoDB 未知鉴别器值
我在这个问题的答案中添加了代码:Unknown discriminator value 'MyEvent',但它没有帮助。
反序列化 EventStore.EventMessage 类的 Body 属性时出错:未知鉴别器值:“插入事件名称”。仅当您在程序重新启动后尝试重新水化已保存的对象时才会发生错误。
运行最新的 MyGet 构建
示例存储库:https ://github.com/tonyeung/EventStore-MongoDB
要复制问题:
运行程序
按 c 创建新记录
按 q 退出
再次运行程序
但按 r 重新水化
错误触发器
如果您运行程序,按 c,按 enter 继续,按 r 重新水化而不退出,对象重新水化没有问题。笏?
github问题:https ://github.com/NEventStore/NEventStore/issues/203
cqrs - 重播事件的 NEventStore 问题
我们正在使用 CQRS + ES。ES 是 NEventStore(以前的 JOliver EventStore)。我们在不同的命令中有 2 个聚合。第二个 AR 的投影取决于读取模型中第一个 AR 投影写入的数据。问题是,当我们运行软件时,一切都进行得如此之快,以至于有时这两个聚合以相同的日期时间(CommitStamp 列)保存在事件存储中。重放事件时,我们从一开始就按 CommitStamp 列排序。但是,如果这两个流具有相同的 CommitStamp 并且顺序错误,则读取模型预测会出现异常。
知道如何解决这个问题吗?
================================
这是在 github https://github.com/NEventStore/NEventStore/issues/170关于这个问题的讨论
================================
编辑:这是我们目前重播事件的方式。我搜索了 GetFrom(...) 的工作原理,结果发现 commitstamp 列不用于排序。毕竟没有提交顺序。因此,如果我开始重播事件,它可能会从今天返回一个事件,下一个是 2 年前记录的事件,下一个等
neventstore - 保持事件类名称的事件上转换
NEventStore 3.2.0.0
据我发现,NEventStore 要求旧的事件类型必须保留以进行事件上转换。
为了让它们在将来正确反序列化,它们必须有一个唯一的名称。建议将其称为EventEVENT_VERSION
.
有什么办法可以避免EventV1
,,,EventV2
...,EventVN
弄乱你的域模型并继续使用Event
?
你的策略是什么?
event-sourcing - 如何在避免 2pc 的同时从聚合根分派命令
我正在使用(优秀的)NEventStore 来持久化聚合根事件流。为了响应某些状态更改,聚合将命令分派到另一个端点。聚合根使用传入的服务发送命令。这在使用 msdtc 时效果很好,但显然是有代价的。
目睹了 2pc 的邪恶之后,我现在想转向一个内置容错的架构。我知道,在启动期间,NEventStore 将自动调度以前失败的事件。
这是否表明所有外部状态更改功能都应该在成功调度聚合事件之后发生,即,将命令调度到另一个端点以响应来自 IDispatchCommits.Dispatch 方法内的特定事件?
或者,也许一个工作单元会更好?
cqrs - NEventStore:未分派事件的分派如何扩展?
尽管我已经深入了解了 NEventStore 上的事务完整性,但我无法理解在连接了许多 NEventStore 实例时 NEventStore 将如何真正扩展。
总结一下我的理解,一个事件被添加到提交中作为未调度,然后它发布到调度程序,然后标记为已调度。
同时,每当您连接 NEventStore 时,它都会查找未分派的事件,然后分派它们并将事件标记为已分派。
但是必须有很短的时间跨度,新事件存储的连接将看到即将(从其他存储)分派的未分派事件。新的事件存储将再次分派事件。
想想这个架构:
Client -> Command Bus -> Command Handler -> EventStore persist -> Dispatch to Event Handlers
如果我们有很多Command Handlers
来处理我们的负载,我们也将持久化许多事件。
如果我们经常处理或创建Command Handlers
,那么许多 EventStore 将被连接起来,并导致调度已经被调度的事件。
我知道调度程序的消费者应该是幂等的,这不是我的问题。我的问题是,在高负载情况下,我们是否会在命令处理程序的消费者上提供不必要的负载?
c# - J Oliver EventStoreRepository 不返回快照
我正在使用 J Oliver 制作的 EventStore 和 CommonDomain 框架。我注意到当我创建快照时,它没有被传递给我的聚合工厂,我想知道为什么。这是我构建聚合的聚合工厂方法:
自我将其添加到方法中以来,当它应该填充快照时,快照参数为空:
它向我显示快照已填充。这里发生了什么?
.net - NEventStore 乐观锁
我是 NEventStore 和一般事件采购的新手。在一个项目中,我想使用 NEventStore 来持久化我们的聚合生成的事件,但是我在正确处理并发方面遇到了一些问题。
如何使用乐观锁写入同一个流?
假设我有 2 个相同聚合的实例,它们在版本 1 中从 2 个不同的线程加载。然后是第一个线程调用命令 A 和第二个线程调用命令 B 。使用聚合的乐观锁之一应该会失败并出现并发异常。
我想使用 maxRevision 从加载聚合的点打开流,但似乎 CommitChanges 永远不会失败,如果我通过旧修订版也是如此。
我错过了什么?使用 NEventStore/Event Sourcing 时乐观锁可能/正确吗?
这是我用来重现问题的代码:
我预计客户端 2 会失败,因为我使用旧版本打开流。
更新 26/08/2013:我已经使用 Sql server 测试了相同的代码,并且似乎按预期工作。
回到我的问题:要启用乐观锁,我应该在打开流时使用修订版吗?还有其他可能的实现或指导方针吗?
谢谢
cqrs - NEventStore 和 EventStoreDB 有什么区别
最近我正在学习 CQRS,并想改变我的系统以使用事件溯源模式。
但是我发现在.Net平台上,有两个Event Store实现。
这两种实现让我感到困惑 - 有人可以解释它们之间的主要区别。