问题标签 [cqrs]

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 投票
2 回答
1161 浏览

cqrs - JOliver EventStore 快照

说我有这个代码:

我怎么知道要为当前流加载什么聚合?我也在使用 CommonDomain。里面有东西吗?

谢谢

0 投票
2 回答
3805 浏览

email - 使用 CQRS 和域驱动设计发送电子邮件或 SMS

目前,我们正在构建一个基于 CQRS 和领域驱动设计原则的新架构。我们现在正在讨论我们应该如何处理外部沟通。为了使问题更具体,我使用了在客户创建订单时发送 SMS 通知的示例。

客户端创建一个由关联的命令处理程序处理的 NewOrderCommand。处理程序在域模型中创建一个新的 Order 对象,该对象生成一个 NewcustomerCreatedEvent。该对象被保存在事件存储中,并且该事件被发布给所有的监听器。

到目前为止一切都很好,但现在是个问题。我们应该在哪里发送短信通知?

我们的第一直觉告诉我们应该使用事件侦听器将其发送出去,该侦听器侦听 NewCustomerCreatedEvent 并发送消息。这种方法的问题在于,SMS 的发送也是我们业务逻辑的一部分。我们正在销售托管服务,因此我们的客户应该能够看到代表他们发送的所有 SMS 消息。因为消息的发送发生在域之外,我们无法做到这一点。

所以我们创建了一个 SMS 域,现在当事件侦听器收到 NewCustomerCreatedEvent 时,事件处理程序创建一个新命令 SendSmsMessageCommand,它将在我们的域中创建一个新的 SMSMessage 对象,发送 SMS 通知并创建一个 SmsSent 事件,我们使用它来创建看法。

起初我们在域模型中发送 SMS 消息,但我们意识到这可能会带来一些问题。假设在发送 SMS 之后发生了一些事情(抛出异常)并且事务被回滚。我们的域完全支持这一点,所以数据方面我们没问题,但是 SMS 消息已经发送,所以当重新发送命令时,SMS 通知将再次发送。

我们正在考虑在 SmSSent 事件上发送 SMS,但这有点奇怪,因为该事件表示消息已发送但尚未发送。

上面的例子给我们带来了一个问题,在 CQRS 和领域驱动设计概念中如何处理外部通信?我们不仅在谈论发送 SMS 通知,而且还在谈论向外部计费系统发送发票以及与外界进行所有其他类型的通信。我们应该在域中这样做,因为它是业务逻辑,还是应该始终基于事件处理程序中的事件来这样做?如果我们这样做,是否可以使用事件表明消息在实际尚未完成时已发送?

希望你们已经处理过这种情况,并可以就这个问题给我们一些建议。

0 投票
1 回答
338 浏览

import - 使用 NService Bus 导入数据

使用 NService 总线。2.00.19(使用 MSMQ 和 SQL 2008)

我们想将数据导入我们的系统。
这些文件可能非常大,所以我们有后台处理器,它将从总线读取消息。这可能需要一个小时来处理。

其他人有这样做过吗?传奇是最好的前进方式吗?

0 投票
3 回答
2236 浏览

cqrs - 将关系数据迁移到事件存储

我正在使用我自己的 CQRS 模式实现将一个旧项目迁移到 CQRS。我开始此迁移的主要原因是摆脱 n 层架构造成的混乱。然而,与许多其他项目一样,该项目正在使用关系数据存储。

此过程中的当前状态是我有进行更改的命令和隔离查询的查询对象。这意味着从客户端到服务器,我有一种 CQRS 式的更改和查询数据的方式,尽管我没有发布来自更改的任何事件,也没有非规范化的读取存储。我应该提一下,我的“领域模型”也有相当贫乏的 DTO。所有行为都分布在 n 层及其处理程序、管理器和所有那些可怕的层中。

我想知道我该如何迈出下一步。我现在想要的是开始构建一个负责其行为的域模型,其原因是我想开始使用事件存储作为事实来源,这让我想到了我的问题:

如何将数据从关系数据存储迁移到事件存储?

我有一个非常规范化的数据模型,其中包含非常重要的数据,必须迁移。我明白我不能指望从该数据中捕获任何意图,因为它已经死了,但我该怎么处理它呢?我应该创建大量迁移命令吗?很高兴听到您的经验。

0 投票
1 回答
481 浏览

cqrs - 如何使用 CQRS 在我的读取数据库中假装重复值

假设我的 ReadDatabase 中有一个 User 表(使用 SQL Server)。在常规读/写数据库中,我可以在表上放置一个索引,以确保不会使用相同的电子邮件地址将 2 个用户添加到表中。

因此,如果我尝试为不同的用户添加我的表中已经存在的电子邮件地址的用户,则 sql 服务器将抛出异常。

在 Cqrs 中我不能这样做,因为如果我将我的 readdatabas 的写入与域模型分离,通过将其放在异步队列中,我不会将异常返回给我,并且我将向 UI 返回“OK”并且用户会认为他被添加到数据库中,而实际上他永远不会被添加到读取数据库中。

我可以在读取的数据库中进行搜索,检查我的数据库中是否已经有用户使用电子邮件地址,如果有,则通过异常返回 UI。但是,如果他们同时按下保存按钮,我将对数据库进行 2 次检查,发现数据库中没有任何用户使用电子邮件地址,我发回说没关系。将它放在我的队列中,稍后它将失败(通过点击唯一标识符)。

我是否想从我的 EventSource(它是一个 SQL Server)加载所有用户,然后检查该集合,看看我是否有一个用户已经拥有这个电子邮件地址。这听起来有点疯狂,我也...

你们是怎么解决的?

我可以看到的方式是不使用异步队列,而是使用同步队列,但这会影响性能非常糟糕,特别是当您有许多“读取存储”要写入时......

在这里需要一些帮助...

0 投票
1 回答
537 浏览

silverlight - 从 Silverlight 查询 RavenDb

需要决定我正在构建的一个 Silverlight 应用程序的架构和设计。应用程序用于需求/问题跟踪。
要求:

  • SL 4
  • ASP.NET (MVC)
  • 完全信任的共享主机环境,IIS7

我想拥有:

  • CQS (CQRS) 风格的分离、查询和命令
  • 一个 db,不需要像“真正的”CQRS 中那样的两个存储,我没有竞争条件,也没有缩放问题。如果我可以使用 RavenDb 那就太好了
  • 对于命令,我将使用在服务器端处理并在客户端 (SL) 上发布的单向命令 DTO 对象,灵感来自“CQRS,停止 CRUDing,爱域”的 NDC11 会话
  • 我喜欢查询数据的 RIA 服务风格,通过 DataService 公开实体,但它确实只适用于 EF 和 NH(关系模型)
  • 如何使用 RavenDb 查询数据?我在共享主机上,所以我必须使用嵌入式模式,并且无法启动 ravendb.exe 进程,它必须托管在 asp.net 应用程序中。我真的没有任何使用 RavenDb 的经验,这就像学习项目。
  • 不想使用 WCF 公开 RPC SOAP 端点,有没有更好的解决方案,REST?

因此,命令端不是问题,但无法弄清楚如何使用 RavenDb、共享托管和一些简单的 REST 样式从 Silverlight 应用程序查询数据。RavenDb 是否支持开箱即用之类的东西?

正如 Ayende 所回答的,RavenDb 可以在 asp.net 中运行,并可以从 Silverlight 进行查询。现在的问题是,至少对于阅读方面来说,这是一种好方法吗?Db 向客户端应用程序公开,没有任何服务器端逻辑(服务/应用程序层),因此任何人都可以修改数据(如果已通过身份验证)。

我是从 Silverlight 执行命令(写入),还是将命令 DTO 对象 (DelegateToOtherMemberCommand) 传输到服务器,然后在域对象 (Ticket.AssignTo(member)) 上执行它?

0 投票
1 回答
300 浏览

domain-driven-design - 从 CQRS 中的 2 个不同聚合访问相同的数据

我是否正在阅读 CQRS 并喜欢这个概念,但发现它与“正常”开发有点不同。我确实发现了一个“问题”,但我没有找到任何关于如何实现的好例子。这就是我如何从 2 个不同的聚合根访问“相同的数据”。我理解它的方式是我序列化聚合根及其对写入数据库的值,然后我永远无法从 2 个不同的聚合根中获得“相同的数据”。

这是我的意思的一个例子。

因此,如果我有一个网上商店并且我出售一件商品,我会减少该产品的 ItemsInStock,所以在我的网页上,我可以显示有多少库存,或者是否必须在交付给客户之前订购。

所以该产品将是一个聚合根,因为我可以向它发送命令,例如 RefillStockCommand(int number)。我将拥有的另一个聚合根是 Order,它将有一个 SendCommand(),它将订单发送给客户等,等等,你明白了。

当我执行 SendCommand() 时,我想减少我订单中所有产品的 ItemsInStock 状态,并且如果其中一些产品低于 5,我想从我的零售商那里订购更多这种产品。那么我是否在我的 Orderaggregateroot 中加载我的产品聚合根可以吗?如果我能做到这一点,那么我会获取我的产品的数据,并在 SendCommand() 中更改我的产品的 ItemsInStock 状态,但是可以访问另一个聚合根中的聚合根,这听起来是错误的,但如果不是,我该如何更改2 个聚合根在 1 个命令中,并在另一个聚合根中使用一个聚合根数据进行业务验证?

最好的问候马格努斯格拉德

0 投票
3 回答
1038 浏览

nhibernate - 使用 NHibernate 进行事件溯源

我正在从纯 DDD 范式转向 CQRS。我目前关心的是 Event Sourcing,更具体地说,是组织 Event Store。我已经阅读了大量的博客文章,但仍然无法理解某些内容。如果我错了,请纠正我。

每个事件基本上包括: - 事件日期/时间 - 事件类型(我们也可以从中找出 AggregateRoot 的类型) - AggregateRoot id (Guid) - AggregateRoot 版本(维护更新顺序) - 事件数据(一些具有更新所需数据的序列化类)

现在,如果我的事件数据由简单的值类型(整数、字符串、枚举等)组成,那么这很容易。但是如果我必须通过另一个 AggregateRoot 怎么办?我不能将整个 AR 序列化为事件数据的一部分(想想所有数据和延迟加载),基本上我只需要存储那个 AR 的 Id。但是,当我需要应用该事件时,我需要先从数据库中获取该 AR。而且从我的域模型(调用存储库和使用 AR Id)中这样做感觉不对。

最好的方法是什么?

ps 对于一个具体的例子,我们假设有一个模型,它由任务和用户实体(都是 AR)组成。任务持有对用户负责人的引用。但是可以更改负责的用户。

更新: 我想我找到了困惑的根源。我相信事件溯源应该只用于构建读取模型。在这种情况下,传递 ID 和原始数据是可以的。但是聚合本身使用的相同事件。这是我无法理解的。

0 投票
1 回答
266 浏览

design-patterns - 在 CQRS 中发布命令时我应该使用什么方法

我可能会使用 NService 总线,我知道事件调度程序会将事件发布给订阅者,但我想知道在第一个实例中发布命令是否正确?

0 投票
1 回答
199 浏览

debugging - 调试 CQRS 应用程序

调试 CQRS 开发环境时 - 您是否会在运行 esb 的情况下进行开发?还是你伪造esb?