问题标签 [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 投票
4 回答
611 浏览

design-patterns - 命令查询分离验证重试

因此,我对 CQS 的基本概念感到满意,您可能有一个写入一个数据库的命令,并更新您从中读取的查询数据库。

但是,请考虑您正在输入数据并希望防止重复的情况。

以新员工数据录入员工登记为例,通过一堆申请表输入新员工的详细信息:

  1. 拿上表。
  2. 在 UI 中键入员工姓名和唯一工资单编号。
  3. 提交。
  4. 将纸张放入“完成的堆”中。
  5. 重复。

您现在如何防止用户再次输入相同的工资单号码,例如,如果他们分心并且不记得他们是否已经输入了一个并且“消息”还没有回到用户搜索的查询数据库?

0 投票
1 回答
5276 浏览

repository - 事件溯源聚合根是否应该有权访问事件溯源存储库?

我正在开发一个事件源CQRS 实现,在应用程序/域层中使用 DDD。我有一个看起来像这样的对象模型:

到目前为止,根据我对 DDD 的理解,Person 和 Booking 都是单独的聚合根,原因有两个:

  1. 有时业务组件会从数据库中单独提取 Booking 对象。(即,已被释放的人由于信息不正确而修改了先前的预订)。
  2. 每当需要更新 Booking 时,Person 和 Booking 之间不应存在锁定争用。

另一个业务要求是一个人一次不能多次进行预订。因此,我担心在读取端查询查询数据库,因为那里可能存在一些不一致(由于使用 CQRS 并具有最终一致的读取数据库)。

是否应该允许聚合根通过 id 查询事件源后备存储中的对象(根据需要延迟加载它们)?还有其他更有意义的实施途径吗?

0 投票
1 回答
2152 浏览

email - CQRS 和电子邮件通知

阅读 CQRS 有很多关于电子邮件通知的讨论——我想知道从哪里获取数据。想象一个场景,其中一个用户邀请其他用户参加一个活动。为了通知用户他已被邀请参加活动,他会收到一封电子邮件。

具体步骤可能是这样的:

  1. CreateEvent服务器接收到具有要邀请的相关用户集合的命令。
  2. 创建一个新的Meeting聚合,并InviteUser为每个被邀请的用户调用一个方法。
  3. 每次邀请用户参加某个事件时,UserWasInvitedToEvent都会引发一个域事件。
  4. 电子邮件通知发件人接收域事件并发送通知电子邮件。

现在我的问题是:我在哪里可以找到包含在电子邮件中的信息?

假设我想包含事件描述以及用户名。由于这是 CQRS,我无法通过我的域模型得到它;域对象的所有属性都是私有的!然后我应该查询读取端吗?或者也许将电子邮件通知完全移动到不同的服务?

0 投票
4 回答
3653 浏览

validation - 如何在 CQRS 中处理基于集合的一致性验证?

我有一个相当简单的域模型,涉及Facility聚合根列表。鉴于我使用 CQRS 和事件总线来处理从域引发的事件,您如何处理集合验证?例如,假设我有以下要求:

  1. Facility's 必须有一个唯一的名称。

由于我在查询端使用最终一致的数据库,因此不能保证其中的数据在事件处理器处理事件时是准确的。

例如,aFacilityCreatedEvent在查询数据库事件处理队列中等待处理并写入数据库。一个新CreateFacilityCommand的被发送到要处理的域。域服务查询读取数据库以查看是否有任何其他Facility' 已使用该名称注册,但返回 false 因为CreateNewFacilityEvent尚未处理并写入存储。newCreateFacilityCommand现在将成功并抛出另一个FacilityCreatedEvent,当事件处理器尝试将其写入数据库并发现另一个Facility已使用该名称存在时,它会爆炸。

0 投票
2 回答
3330 浏览

domain-driven-design - 在 CQRS(事件源)中,您是否需要事件存储中的全局序列计数器?

在试图了解 CQRS(以及一般的 DDD)时,我遇到了两个事件发生在不同聚合上但它们的顺序具有领域意义的情况。如果是这样,那么它们可能发生得如此紧密,以至于时间戳(正如我所看到的示例实现所使用的)无法区分它们,这意味着事件存储不包含域的“完整”表示,因为顺序存在歧义其中发生的事件。

例如,域可以触发一个CustomerCreatedEvent应用于Customer聚合的事件,然后在聚合上触发一个CustomerAssignedToAgent事件Agent。如果事件发生在 之前,则该CustomerAssignedToAgent事件没有意义CustomerCreatedEvent,但通常这两者都可能由于一个操作而被触发,这使得时间戳可能实际上是相同的。

那么我只是在建模不好吗?是否应该存在跨不同聚合的事件顺序很重要的情况?或者您应该在事件存储中保留一个全局序列号,以便您可以识别事件发生的确切顺序?

0 投票
1 回答
1158 浏览

asp.net-mvc - 将事务脚本模式与 DDD/CQRS 混合

这里是这样的情况,为了支持我们的遗留系统,我们需要在用户登录时插入到表中。这基本上是一个 CRUD 操作,所以创建存储库/实体/命令/事件并没有真正意义因为这根本与任何业务规则无关。创建 CQRS 命令的唯一好处是该数据库写入可以在该模型下异步发生。走哪条路比较好?

  • 使用 CQRS,然后调用存储过程。处理该命令时?
  • 直接在控制器中调用数据库(我用的是asp.net mvc)
0 投票
1 回答
291 浏览

architecture - 我可以构建一个 Web 应用程序,以便将其部署到云或专用服务器/VPS 吗?如何?

是否有一种足够通用的架构,可以将其部署到云服务器或专用(或 VPS)服务器,而只需进行最少的更改?显然会有配置更改,但我宁愿让应用程序的其余部分保持一致,保持一个可维护的代码库。

该应用程序将是 ASP.NET 和/或 ASP.MVC。我的开发环境是 VS 2010。云可能是,也可能不是 Azure。专用或 VPS 将是 Win Server 2008。可能。

它不是一个面向公众的网站。我想到的网络应用程序将是每个客户端的单独部署。有些客户端规模较小,有些客户端更喜欢在本地 Intranet 上运行该应用程序,而不是在 Web 上运行。其他客户可能更喜欢将云方法用于黑盒解决方案。该应用程序可能会运行几个小时,也可能会无限期运行,这取决于客户和项目。除了部署场景之外,这些应用程序或多或少是相同的。

正如您从标签中看到的那样,我假设基于消息的架构可能是最通用的,但我也习惯于在这些东西上犯错。

欢迎所有关于一般架构和特定解决方案的建议和指示。

0 投票
3 回答
2018 浏览

domain-driven-design - CQRS - 命令是否应该尝试创建“复杂”的主从实体?

我一直在阅读 Greg Young 和 Udi Dahan 关于 Command Query Responsibilty Separation 的想法,我读到的很多内容都引起了我的共鸣。我的域(我们跟踪正在交付的车辆)具有包含一个或多个停靠点的路线的概念。我需要我的客户能够通过调用 Web 服务在我们的系统中进行设置,然后能够检索有关路线和车辆行驶情况的信息。

在过去,我会拥有与我的域类非常相似的“缩减”DTO 类,客户将创建一个带有 StopDto 数组的 RouteDto,并调用我们的 CreateRoute 网络方法,传入 RouteDto。当他们通过调用 GetRouteDetails 方法查询我们的系统时,我会返回完全相同的对象给他们。CQRS 吸引人的方面之一是 RouteDto 可能具有客户想要查询的各种属性,但在创建 Route 时没有业务设置。因此,我创建了一个单独的 CreateRouteRequest 类,该类在调用 CreateRoute“命令”时传入,以及一个作为查询结果返回的 Route DTO 类。

但我需要我的客户在创建路线时向我提供路线和停靠点详细信息。在我看来,我也可以...

给我的 CreateRouteRequest 类一个 Stops(s) 属性,它是一个“东西”数组,代表他们需要提供的关于每个停靠点的数据 - 但我怎么称呼这个类?这不是一个停止,因为这就是我在我的 Route DTO 中调用 DTO 的列表,但我不喜欢“CreateStopRequest”。我还想知道我是否陷入了一种 CRUD 思维模式,考虑主从信息,并要求客户也这样想。

或者

他们调用 CreateRoute,然后多次调用 AddStopToRoute 方法。这感觉有点“行为”,但我将失去将创建包括其停靠点的路线视为单个原子命令的能力。如果他们创建了一个 Route,然后尝试添加一个由于某些验证问题而失败的 Stop,他们将有一个部分正确的 Route。

我无法为我将在选项 1 中使用的“StopCreationData”对象列表想出一个好名字,这让我想知道我是否遗漏了一些东西。

0 投票
1 回答
647 浏览

php - 是否有支持 CQRS 的 stackoverflow/reddit/slashdot PHP 克隆?

CQRS 表示命令查询职责分离。

0 投票
2 回答
8242 浏览

domain-driven-design - CQRS + DDD + 事件溯源中的聚合间通信

在基于 DDD 原则构建的环境中,使用事件源聚合后端,单独的聚合根(AR) 应如何相互通信?

例如,我有一个Facility聚合根 (AR),它有一个负责创建BookingAR 的工厂方法。这BookingPersonAR 和FacilityAR 的时间敏感组合。APerson只能单人预订Facility

在 DDD 中,我会持有对BookinginPersonPersonin的引用Facility。但是,在生成用于事件溯源的事件时,我认为尝试从后端处理事件反序列化会变得令人望而却步。因此,我只保留对基于值对象的唯一 ID 的引用。然而,这带来了一个新问题,当 AR 上的一个方法需要调用另一个 AR 上的另一个方法时——你如何处理这种情况?从域 AR 中访问事件源存储库?

这种情况下的一般用例是什么?我接近这一切都错了吗?