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

cqrs - 我们是否需要在 CQRS 中混合使用同步和异步命令处理程序?

  1. 用户在我们的站点上注册并登录。RegisterUserCommand 被发送到异步命令处理程序。
  2. 用户想要更改他们的地址,但 RegisterUserCommand 尚未处理。系统中没有用户记录。

这是同步命令处理程序的情况吗?将在验证用户之前创建用户记录。还是我应该在注册后重新考虑对真实用户的要求?在创建帐户之前,用户将无法访问该站点。如果用户不能立即访问系统,则使用率可能会下降。

在 CQRS 系统中混合使用同步和异步命令处理程序是否常见?

0 投票
1 回答
1638 浏览

nservicebus - 正确处理 NServiceBus 超时

NServiceBus 提供了超时机制。从nservicebus.com

基类上的 RequestTimeout 方法告诉 NServiceBus 将消息发送到另一个端点,这将为我们持久地保留时间...... NServiceBus 附带一个称为 Timeout Manager 的过程,它提供了此功能的基本实现。

当时间到时,Timeout Manager 会向 saga 发送一条消息,导致使用最初传递的相同状态对象调用其 Timeout 方法。

正如我所看到的,即使消息已传递给接收者,也有可能触发超时(例如,回复卡在某处)。

我如何设计我的应用程序,以使我的应用程序无论消息是否发送到接收者都能正确运行。

0 投票
1 回答
2733 浏览

google-app-engine - 在 AppEngine 之上实现 CQRS 的端到端示例

实现基于CQRS的应用程序所需的所有基础架构组件似乎在 AppEngine 中都是开箱即用的。

不幸的是,我找不到与此主题相关的任何内容。

几个可能的原因

  • 这是“建筑宇航员”之外的秘密
  • 这是一个毫无价值的矫枉过正的架构,因为 AppEngine “按设计”向外扩展
  • 还不是主流

但是,即使没有完整的代码可用,只要任何人有关于 AppEngine 之上的 CQRS 的提示、目标代码位、优缺点,我都会非常荣幸地从您的知识中受益。

提前致谢。

注 1:至少,.Net 生态系统中存在一个类似的项目(Lokad-CQRS 以 Windows Azure 为目标)
注 2:即使我比较喜欢 python,也欢迎与 Java 经验相关的答案

0 投票
1 回答
850 浏览

cqrs - CQRS 命令和域状态

我是 CQRS 的新手,对命令如何将地址更改写入客户对象感到困惑

假设我已将客户信息分为两个表

客户 - 域数据库

活跃首选

Customer_读取数据库

姓名,

地址,

电话,

电子邮件

用户修改客户地址。地址字段都在读取数据库中。可能有 3 个或更多查询友好的表来保存地址信息。

如果我了解 CQRS 实现(示例)客户域(已删除聚合根)应该发布有关地址更改的事件,该事件应该由多个处理程序处理以更新每个表。

当我不会更改客户对象的状态时,如何实现这一点?域是否必须知道它在另一个数据库中有地址?

先感谢您。

问候,

三月

更新 -

在网上浏览了更多帖子后,我假设如果命令未更改状态,则不会生成任何事件来保存域本身,但将应用事件来更改查询/查看模型友好表中的地址。

0 投票
1 回答
778 浏览

cqrs - CQRS 中的验证和错误修复

我了解了 CQRS 的一般概念,但是当涉及到超越示例代码和幻灯片来处理现实世界的问题时,我有几个问题。

  1. 验证

    当您需要对涉及检查数据库值的命令进行验证时,您会怎么做?注册一项服务,我必须输入一个唯一的电子邮件地址。我听到的一个论点是,用户不太可能输入重复的电子邮件地址,因此只需在处理命令时处理它并向他们发送一封电子邮件说“对不起”,或者可能建议他们重置密码。因此,为了验证,此过程避免了读取模型。但是您如何处理命令处理程序中的重复案例?你怎么知道它是重复的?检查读取模型?您不妨一开始就使用它以获得更好的可用性。

  2. 功能更改/修复错误

    当您需要更改命令的工作方式或修复错误时会发生什么?在仅附加的哲学中,我该如何处理所有旧命令和命令处理程序?我不能将它们重命名为 _legacy 并将它们隐藏起来,否则我的事件反序列化将不起作用。有什么优雅的解决方案来处理这个问题?

谢谢

0 投票
1 回答
3609 浏览

cqrs - CQRS 和领域事件

CQRS 让我进入了思考模式。我正在尝试用 CQRS 的想法开始一个新项目。我喜欢的主要事情是
1) 查询和命令的分离。我们的域查询一直是个问题。
2) 使用事件存储进行审计——我不会将它用于重放——至少现在不会。

我擅长查询方面,但我仍然对领域事件有一些疑问

如果命令导致更新多个聚合根(例如 Order 和 OrderDetail),我会将它们的范围限定在 UnitofWork(事务性)下。现在每个域都负责在其状态发生更改时发布事件。

假设该命令更改了 3 个 orderDetail 记录。每个 OrderDetail 将发布 2 个事件。最后我们有 6 个事件。

a)如果我在对域对象进行更改后立即发布事件(但未提交事务),我如何撤消已发布的事件(并且可能已被订阅者消费)

  • 我能想到的是将要发布的事件保存在“在同一工作单元范围下”的列表中,一旦调用了事务提交,就将其存储并发布。这听起来是不是一个人会做的事情。

b) 如果 OrderDetail 中的更改要求 Order Aggregate Root 中也发生一些更改,那么
i) 我是否应该通过处理 OrderDetail Aggregate 发布的事件来基于这些更改?例如。让我们说两个订单详细信息被删除。这使得订单状态从 "preferred" 变为 "Not preferred" 。ii) 如果事件发生错误并且不更新订单状态怎么办 - 如果订单仍然是首选,那么它会在 2 天内发货。

添加另一个问题
c)“域事件是所有应用程序状态更改的来源”还是“所有应用程序状态更改的结果”

先感谢您,

三月

0 投票
2 回答
2020 浏览

domain-driven-design - 将 CQRS 和 DDD 与域事件和 ServiceBus 一起使用时在视图中显示更改

我对使用域事件构建读取模型的系统中的流程有点困惑。特别是,我们如何处理用户期望数据(及其视图)在他们完成命令时发生变化的事实,但由于我们的系统架构(发布事件的非阻塞调用),实际数据库可能不会在页面是否重新加载?

我希望使用事件和服务总线将我们其中一个系统的设计与 CQRS 更加内联。

假设我的流程是这样的:

  1. 用户单击视图中的按钮以执行从其帐户中删除付款方式的任务。

  2. 控制器调用 PaymentMethodRemovalService,将 accountId 和 paymentMethodId 传递给它。

  3. 控制器使用 AccountRepository 检索 Account 并调用 account.RemovePaymentMethod(id)

  4. 帐户验证可以发生操​​作并发布事件 PaymentMethodRemovedMessage(accountId, paymentMethodId)

  5. 因为事件发布是异步的,我们现在必须从服务返回并从控制器返回视图——但我们的实际数据还没有更新

  6. 处理程序 IHandle< PaymentMethodRemovedMessage > 听到事件并从数据库中删除实际行

那么,男人该怎么办?

我可以简单地说,删除显示付款方式的 div。这可能适用于 AJAX 场景,但如果我使用 Post-Redirect-Get 来支持非 JavaScript 客户端怎么办。然后我将触发我的 Get 并从 Query 端读取数据,可能在更新之前。

我是否只显示一条通知,说明他们删除付款方式的请求已提交?(这似乎并不友好,对于提交订单有意义,但对于更改地址则不然)。

有没有办法协调将更改实现为分离的异步事件并显示反映其当前更改的用户数据?

编辑:我的问题与CQRS、DDD 同步报告数据库非常相似, 我不得不说,那里给出的答案以及这里也提到的,有点味道 - 争吵 UI 以显示带外的更新可以这么说,读取数据库。我希望有一些更清洁的东西。

0 投票
2 回答
490 浏览

asp.net-mvc - ASP.NET MVC 三层 - 其他人都在做什么?

当我开始开发一个新的 Web 应用程序时,我倾向于使用经过试验和测试的 ASP.NET MVC、BLL(由一组包含所有业务逻辑的服务组成)和一个 DAL(由一组存储库组成)的相同架构这促进了工作单元模式而不是像EF /*Linq to SQL*) 这样的东西。

控制器仅与服务对话,服务仅与存储库和其他服务对话。在服务层是定义模型的地方,这些模型用作控制器的输入/输出。

我的问题是:其他人在做什么?我很想知道人们是否在 ASP.NET MVC Web 应用程序的上下文中做任何不同的事情。例如,有CQRSDomain Events等概念。有没有人使用这些来解决我上面描述的方法的问题?

这个问题主要是试图发现我不知道我不知道的东西的来源。我希望这不是太模糊,但我认为重要的是要看看别人在做什么来评估你自己的方法。

0 投票
1 回答
3989 浏览

architecture - 与 CQRS 的多对多关系的替代方案

我们如何使用 CQRS/DDD 建模经典的多对多关系?

我知道 DDD 和 CQRS 的实现和解决方案往往是特定于域的,因此可能很难对这个问题提出一般性的答案。

但是,假设我们在BookAuthor之间有熟悉的关系。这是一个经典的多对多关系。

对我来说, BookAuthor是两个不同的实体,每个实体都属于自己的Aggregate Root,这似乎是最自然的。因此,明确地建模它们之间的多对多关系并不是要走的路。

我们如何为 AddBookCommand 建模?我们希望能够将一本书添加到我们的图书馆,并以某种方式声明特定作者写了这本书。我们如何建模(并保持)这种关系?

BookAuthor似乎都不是价值对象的好候选人......

0 投票
3 回答
5488 浏览

domain-driven-design - 事件溯源和读取模型生成

假设堆栈溢出域问题和以下事件定义:

假设事件存储的状态如下(按出现顺序):

假设以下问题列表的非规范化阅读模型(对于 SO 的第一页):

以及以下事件处理程序(构建非规范化读取模型):

我的问题是如何找到提出问题的用户的姓名?或者更常见:如果我的非规范化读取模型需要特定事件中不存在的额外数据,我应该如何处理事件?

我检查了现有的 CQRS 样本,包括Greg Young的SimpleSQRS和 Mark Nijhof 的Fohjin样本。但在我看来,它们仅使用事件中包含的数据进行操作。