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

nservicebus - 当 MSDTC 两端都不可用时如何使用网关配置 nservicebus

我是 NServiceBus 的新手,试图将消息传递引入 WCF/RPC 解决方案。

由于架构限制和开销(内存和 CPU 使用率已经很高),IT 运营将不允许 MSDTC。(我也很想避免 2PC fwiw)。我还需要通过 http 发送消息,因此 NSB 桥看起来是一个很好的解决方案。

根据这些帖子(how-i-avoid-two-phase-commitextended-nservicebus-avoiding-two-phase-commits),在我看来好像可以在禁用 DTC 的情况下使用 NSB。听起来EventStore确实设法避免了 2PC,就像我想设置 NSB 一样,但目前我只想让 NSB 工作,而不是在混合中添加事件源。

问题:

  1. 有没有配置 NSB 以这种方式工作的示例?我很高兴添加额外的复杂性(具有本地消息状态存储的自定义消息处理程序) - 如果没有 2PC,就没有其他选择。我已经知道这个例子(IdempotentConsumer),但是这个 repo 的测试项目不包含任何代码。如果有一个使用 nosql 存储的例子会更有帮助。
  2. 我需要改变 NSB 桥接器来处理没有 DTC 吗?我猜没有 - 桥接事务仅针对本地队列,但消耗本地队列的进程显然需要编码以避免 2PC。正确的?
  3. 在没有 MSDTC 的情况下使用 NSB 是否还有其他有用的资源/帖子?解决方案(how-i-avoid-two-phase-commit)似乎并不太复杂,但考虑到我刚刚开始使用 NSB,找到一个快速入门会很棒......
  4. 我原以为这将是一种常见的情况 - 但似乎没有太多关于在仍然使用 NSB 的同时避免 MSDTC 的文章。当然还有其他人正在使用消息总线,但不允许使用 MSDTC ......还有另一种我错过的明显方式吗?

谢谢

0 投票
1 回答
1853 浏览

visual-studio - CQRS/事件溯源项目结构

我有我的第一个使用事件溯源的 CQRS 项目,我想知道与涉及多层的其他项目相比,这种类型的项目是否应该在 Visual Studio 中以不同的方式构建?

例如,在过去创建的项目中有 Remoting、应用程序服务、域等层,并且很明显每个层/组件都触及它下面的层。这些程序集似乎做了很多事情,使用 NDepend 之类的工具确实对项目的结构说了很多。

但是,对于 CQRS 项目,最好只有较小的程序集来显示其意图,即命令程序集、事件程序集、事件处理程序程序集等。

现在使用 NDepend 可以更好地表示如何使用程序集。

0 投票
2 回答
1558 浏览

azure - 是否可以使用 Azure 表存储进行条件插入

是否可以使用 Windows Azure 表存储服务进行条件插入?

基本上,我想做的是将新行/实体插入到表存储服务的分区中,当且仅当自上次查看以来该分区中没有任何更改时。

如果您想知道,我想到了事件溯源,但我认为这个问题比这更笼统。

基本上我想读取部分或整个分区并根据数据内容做出决定。为了确保自加载数据以来分区中没有任何变化,插入应该表现得像正常的乐观并发:只有在分区中没有任何变化时插入才应该成功 - 没有添加、更新或删除行。

通常在 REST 服务中,我希望使用 ETag 来控制并发,但据我所知,分区没有 ETag。

我能想出的最佳解决方案是为包含时间戳/ETag 的表中的每个分区维护一个单行/实体,然后将所有插入作为包含插入的批次的一部分以及对此的条件更新时间戳实体'。但是,这听起来有点麻烦和脆弱。

Azure 表存储服务可以做到这一点吗?

0 投票
4 回答
2054 浏览

java - 是否有 Java 端口或等效的 NEventStore 库?

我已经阅读了Jonathan Oliver的 .NET EventStore库,我必须说这个概念对我很有吸引力:只有一个简单的无依赖库,它是非侵入性的,只专注于事件源,留下了很多在选择数据库、消息传递等技术时的自由度。

我的问题:Java 世界中是否也有类似的东西?我知道有各种与 CQRS 相关的框架,比如AxonJdon,但它们所做的不仅仅是事件溯源......也许有人在一个简单的端口上工作吗?

0 投票
1 回答
767 浏览

cqrs - CQRS/EventStore - 改变两个聚合

我有一个更新两个聚合的命令。由于聚合路由是事务边界,我有一个命令对第一个聚合执行 repository.Save() 操作,然后我触发另一个命令(从第一个命令中)作用于第二个聚合。每个 Save() 操作都会启动其 Event-Store 事务并提交更改,然后发布它们。

首先这是正确的,即让一个命令通过另一个命令通知另一个聚合?

我在 Mark Nihjof 的代码中注意到他使用事件处理程序,这很好,因为您可以将事件处理程序注册到同一个事件。我尝试使用 J Oliver 的 Event-Store 执行此操作,但 IDispatchCommit 中的 commits.events 在处理第二个聚合值时引用了第一个聚合值。这导致了一些奇怪的错误。

那么我应该找到一种使用 EventHandlers 进行这项工作的方法,还是在命令中触发命令好吗?

京东

编辑- 我已经将我的电线切换到使用 .UsingAsynchronousDispatchScheduler() 并且现在允许注册的事件触发多个事件处理程序,这反过来会触发另一个聚合上的命令并且它似乎可以工作。那么,这是正确的方法而不是使用命令触发命令吗?

0 投票
2 回答
594 浏览

c# - 如何在更改域事件结构后检索历史事件

给定带有字段的事件存储:

  • AggregateId : 整数
  • 有效载荷:blob
  • 版本:整数

其中包含基于以下事件的事件:

...然后添加了更新结构的更多事件:

当检索到这些历史数据(用于分析等)时,如何将二进制有效负载重构为有意义的数据?

注意:上面的代码不是一个好的事件/事件存储实现的例子。我只想知道应该如何处理这种情况。

0 投票
2 回答
3933 浏览

.net - 何时使用 Eventstore

我不太确定我理解 Eventstore 是什么,我认为它是 Domainobjects 的某种“事务日志”。它的优点/缺点是什么,什么是使用它的好场景,什么时候不应该使用它?

编辑:

由于我可能要求太多,如果有一个“简单”的场景何时使用事件存储,何时不使用,我会很高兴?换句话说:是否可以仅用几句话来描述这两个场景,还是我需要阅读 5 本书才能理解?

0 投票
6 回答
12762 浏览

cqrs - 没有事件溯源的 CQRS - 有什么缺点?

除了缺少事件溯源的一些好处之外,在没有事件溯源的情况下将现有架构适应 CQRS 是否还有其他缺点?

我正在开发大型应用程序,开发人员应该能够在接下来的几个月内将现有架构分离为命令和查询,但是在这个阶段要求他们也添加事件源将是资源配置的一个巨大问题看法。我是否因不包括事件溯源而亵渎神明?

0 投票
1 回答
768 浏览

database - 哪一对 DBMS 在与 CQRS 结合时提供最快的读/写?

如果我采用 CQRS 和 Event Sourcing 之类的东西,那么人们会推荐什么作为用于个人阅读和写作的同类最佳技术?

理想情况下,建议的解决方案应该是开源的。我并不太关心复制/镜像等功能,因为我打算通过事件溯源来实现其中的大部分功能。

我听说 Cassandra 适合写作,而 Membase 适合阅读?

0 投票
8 回答
15300 浏览

domain-driven-design - CQRS 事件溯源:验证用户名的唯一性

我们以一个简单的“账户注册”为例,流程如下:

  • 用户访问网站
  • 点击“注册”按钮并填写表格,点击“保存”按钮
  • MVC 控制器:通过读取 ReadModel 来验证用户名的唯一性
  • RegisterCommand:再次验证用户名的唯一性(这里是问题)

当然,我们可以通过读取 MVC 控制器中的 ReadModel 来验证 UserName 的唯一性,以提高性能和用户体验。但是,我们仍然需要在 RegisterCommand 中再次验证唯一性,显然,我们不应该在 Commands 中访问 ReadModel。

如果我们不使用事件溯源,我们可以查询领域模型,所以这没有问题。但是如果我们使用事件溯源,我们无法查询域模型,那么我们如何在 RegisterCommand 中验证 UserName 的唯一性呢?

注意: User 类有一个 Id 属性,UserName 不是 User 类的关键属性。使用事件溯源时,我们只能通过 Id 获取域对象。

BTW:在需求中,如果输入的用户名已经被占用,网站应该向访问者显示错误消息“对不起,用户名XXX不可用”。不能向访问者显示“我们正在创建您的帐户,请稍候,我们稍后会通过电子邮件将注册结果发送给您”这样的消息是不可接受的。

有任何想法吗?非常感谢!

[更新]

一个更复杂的例子:

要求:

下单时,系统会检查客户的订单历史,如果他是有价值的客户(如果客户在去年每月至少下过10个订单,他是有价值的),我们对该订单进行10%的折扣。

执行:

我们创建 PlaceOrderCommand,在命令中,我们需要查询下订单历史,看看客户端是否有价值。但是我们怎么能做到呢?我们不应该在命令中访问 ReadModel!正如 Mikael所说,我们可以在帐户注册示例中使用补偿命令,但如果我们在此排序示例中也使用它,它会太复杂,代码可能太难以维护。