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

php - 在 CQRS 中非规范化的最佳实践是什么?

我正在尝试创建一个守护程序来非规范化我的数据库。

我使用 ActiveMQ 作为队列管理器我有 2 个数据库:关系数据库(写入 + 复制)和非规范化数据库(用于读取)

我的问题是非规范化我的真实数据库的最佳实践是什么我有一些想法:

  • 读取队列的 MySQL 代理(使用 lua)(这可能吗)
  • 在 MySQL 中触发
  • Java 守护进程作为读取队列的服务
  • cron 选项卡?(但我会有很大的延迟时间
0 投票
3 回答
6125 浏览

cqrs - CQRS:同步写入和读取数据库

谁能给我一些关于同步写入和读取数据库的各种方法的指导?

有哪些不同的技术,你如何评估每一种技术,包括可靠性、性能、实施成本等。

0 投票
1 回答
1102 浏览

transactions - 命令处理程序和执行的事务边界是什么?

让我们以一个用于编辑客户信息的 UI 示例为例。用户编辑 5 个字段并按下“提交”。因为我们是优秀的抽象主义者,所以我们对 5 个字段进行了编辑,并使它们成为不同的命令(描述对特定字段的编辑)。

命令处理程序最终会在使用 NHibernate 等工具持久化的对象上设置属性,因此我们最终会对数据库执行 UPDATE。

我的主要问题是:从数据库性能的角度来看,发出单个 UPDATE 语句更有意义还是发出 5 个不同的 UPDATE 语句更有意义?

我喜欢命令处理程序作为事务边界的想法。要么它工作并且事务被提交,要么它不工作并且事务被回滚(我们可能重新排队再试一次)。每个命令的成功或失败相互独立。

另一种方法可能是将这些命令的处理包装到单个数据库事务中,这样当 NHibernate 决定刷新时,它最终会发送单个 UPDATE。但这使得命令的处理成为一种全有或全无的交易,我不一定能异步执行它们。

但是,如果我想确保所有命令都正确执行,并在失败的情况下完全回滚?也许有一个包含许多较小事务的分布式事务?这可能导致数据库争用,增加死锁的风险,从而减慢处理速度(进一步增加死锁的风险)。但与此同时,一致性是关键。我想这是可用性和一致性之间的权衡(参见 CAP)。

0 投票
2 回答
436 浏览

.net - CQRS - CommandHandlers 是否应该调用其他 CommandHandlers

只是试图就 CommandHandlers 是否可以/应该与其他 CommandHandlers 通信获得一些意见。

这是我刚刚遇到的一个简单案例。我有一个 ChangePasswordCommandHandler,其命令如下所示:

因此,在处理程序内部,我需要验证用户的旧密码,所以我看到它有三个选项:

  1. 向我的 ValidateCredentialsCommandHandler 发出呼叫。
  2. 将一些验证逻辑分解到两个处理程序都可以使用的服务中。
  3. 让调用进程首先进行此检查,但现在业务逻辑泄漏到我的域层之外。

我在调度到其他处理程序时遇到了一些技术问题,主要是 b/c 我正在使用每个 Web 请求的事务,所以我有两个事务试图竞争。

想法?

0 投票
1 回答
2786 浏览

.net - CQRS、DDD 同步报表数据库

我们正在尝试 CQRS 和 DDD 以及事件溯源。假设我有一个客户更新了一个电子邮件地址,它触发了 CustomerUpdatesEmailAddress 事件,这将通过我的操作(写入数据库)并更新表。我们的系统设计为有一个 ETL 进程运行,它获取操作数据并更新数据库(这是一个读取数据库)。鉴于 ETL 可以根据更改的电子邮件地址进行一些繁重的工作(电子邮件地址只是一个示例),当用户希望在屏幕上立即看到电子邮件地址更新时,我们如何同步报告数据库(数据集市和运营方)?

0 投票
2 回答
524 浏览

cqrs - CQRS - 消费事件服务

我的问题是关于订阅 CQRS 中命令发布的事件的消费事件服务。

假设我有一个文档生成服务,它将根据某些事件生成一些文档,文档生成服务是否通过聚合根从域加载数据?如果是这样,文档生成服务不会加载可能在生成服务接收到的事件之后更新的数据吗?你将如何阻止这种情况发生?

我想我假设事件只会传递命令 DTO 接收到的信息并将整个域模型数据传递给事件感觉非常错误。

0 投票
2 回答
2108 浏览

cqrs - CQRS - 最终一致性

我有以下需要按照 CQRS 模式实现的场景:

  1. 用户登录
  2. 用户输入一些保险细节
  3. 用户要求做出决定
  4. 用户查看决策结果

这看起来相当简单,但是我的问题在第 3 步和第 4 步之间,在第 3 步中,我发送了一个ApplyForDecision命令,该命令将从承保服务处获得决定,然后将具有该决定结果的事件发送到 BUS 以供读取存储稍后使用它并使用决策结果更新视图表。

问题出在 UI 上,我如何让用户知道正在应用该决定,因为在 CQRS 中,读取模型没有“直接”更新我如何让 UI 显示一个决定正在进行中并且“很快” ' 到达?

我还需要让用户能够注销并重新登录,因为该决定可能尚未应用,如何让 UI 显示“待决决定屏幕”?

0 投票
4 回答
1460 浏览

architecture - CQRS 可以用于 StackOverflow 之类的网站吗?

您可以使用 CQRS(命令-查询职责分离)架构模式来构建像 StackOverflow 这样的网站吗?我对 CQRS 和 DDD(域驱动设计)相对较新,并且正在探索该模式并尝试为我熟悉该模式的站点建模。虽然我可以看到 CQRS 对于像 StackOverflow 这样的网站的许多方面都很有用,但有一些领域我不确定是否可行(或者,至少,我无法立即弄清楚)。具体来说:

  • 提出问题 当我创建一个问题时,我会立即看到它并且可以对其进行编辑。在 CQRS 中,我发出类似“AskQuestion”的命令,并创建一个名为“QuestionAsked”的事件。最终,问题被推送到非规范化数据存储中。但 SO 的经验是立竿见影的。CQRS 可以做到这一点吗?
  • 投票 我的投票会立即反映。在 CQRS 中,我会想象这些命令/事件最终通过事件总线移动到读取存储。但是 SO 立即给了我信息。

我真正关心的是 SO 提供的即时反馈的概念。CQRS 可以提供这个吗?如果是这样,这将如何完成?有没有很好的例子来说明如何处理这个问题?

如果有帮助,我的环境是 VS2010/C#/SQL2008R2,但我对 SQLite 等其他选项持开放态度。我还在研究 NCQRS 和 LOKAD 的框架,以及 Mark Nijhof 的示例,并计划下载 Greg Young 的示例. 对于 CQRS 样本,我没有找到太多其他内容。

谢谢!

0 投票
1 回答
2263 浏览

cqrs - 在 CQRS 中的一次事务中创建多个聚合根

我想知道如何在 CQRS 中创建多个聚合根。

示例:我有一个手机聚合根和 Simcard 聚合根。这些聚合的 id 应该是订阅聚合根的一部分。

我需要创建一个基于 SimCard 的订阅聚合,并且系统中不存在 Handset.SimCard 和 Handset 聚合。它们是在创建订阅时创建的。当 Subscription 被删除时,SimCard 和 Handset 未被删除。商业原因:用户可能将不同的 SimCard 插入同一个手机或手机支持双 SimCard。

业务规则:电话号码应该是唯一的。手机序列号应该是唯一的。一个订阅与一部手机相关联 一部手机与一个或多个电话号码相关联。

  • 隐藏引用的文字 -
  • 显示引用的文字
0 投票
4 回答
1007 浏览

c# - CQRS - 如何处理查看页面或查询的用户

我正在将 CQRS 用于我正在构建的应用程序(具有复杂业务逻辑的在线讨论系统),并且我在实现中遇到了让我担心的部分。

我应该如何处理综合浏览量?如果用户查看线程,我想跟踪它。因为我想跟踪它,所以我应该创建一个命令和一个事件,并将其绑定到负责我正在查看的对象的聚合根(例如,分别为 UserViewsThread 和 UserViewedThread)。但这似乎效率很低——除此之外,没有理由在讨论系统的许多用例(查看论坛/线程)中找到聚合根。现在我正在介绍这个,我将在页面的每个视图上都有一个额外的命令调度和事件发布,这反过来又负责“后台处理”线程聚合,序列化我的事件,并将其发送到我的事件出版商。

必须有更好的方法来做到这一点。我正在考虑也许让我的控制器对象能够调度事件 - 但是通过绕过我的聚合,我不能再将行为附加到页面浏览量。

另一种可能性是使用它作为验证我的用户的方式的想法。将允许 UserViewsThread 和 UserViewsForum 命令引发身份验证异常,让我的控制器知道用户无法执行此操作。但是,如果这些被翻译成事件,并存储在我的事件存储中,我们谈论的是在每个页面视图上创建的多个事件- 这很可能会破坏性能(每个页面视图都会导致数据库事务......呃)和资源管理。

你男朋友的想法是什么?