- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在研究是否可以在构建特定系统时应用 CQRS,并且有一些我无法轻易找到答案的问题。
命令可用性/验证
用户可以对特定实体做什么通常不仅与用户的角色相关,还与该特定用户与该实体的关系(例如作者)和该实体的状态(公共(public)、存档等)相关。
在我看来,在 CQRS 中,用户操作映射到负责处理它们的命令,但不清楚如何确定哪些操作和命令可用。
返回每个读取模型的可用命令列表似乎不合适,因为由于需要一致性,我们必须检查仅与用户角色相关的命令(例如菜单项)。
当然,命令必须在事务中再次进行验证,以防另一个用户更改状态使命令无效)。
抵抗需求变化
以我的经验,维护一个逻辑冗长且与特定业务对象相关的类/表过多的系统是一场噩梦。
在 CQRS 中,一个特定的业务实体可能有多个读取模型。当需要更改该实体时,也应修改所有相关的读取模型。
为了可维护性,有必要以某种方式将它们关联起来,以便在重构时很容易看出。
在相关说明中,有很多过于具体的命令也会导致可维护性问题 - 我假设每个用例一个命令应该最有效是正确的吗?
读取模型和不修改域模型的命令
在 CQRS 中,命令应该更新读取模型,同时用户可以访问它的旧版本。
在我看来,有两种特殊情况会导致问题。
首先,有些命令不会修改域模型本身(可能只是状态),而是执行一些涉及第三方系统/框架/电子邮件等的操作,在某些情况下,这些命令可能需要相当长的时间才能运行。
正如我在这里看到的,我们需要一个将域模型与命令执行状态相结合的读取模型。此读取模型可用作当前正在处理的项目的历史记录或列表。
其次,一些命令会产生结果。当命令成功完成时,需要向用户显示此结果,并且在某些情况下必须在一段时间后丢弃,甚至是文件。因此,必须有一种方法将这些命令的结果存储在数据库中,并将它们与特定的命令实例相关联。换句话说,有一个临时读取模型。
读取模型表与内存缓存
另外我的想法是正确的,使用二级 ORM 缓存(用于查询结果),不需要为读取模型提供数据库表,而是 ORM 可以在第一次执行查询时生成它们,缓存结果并使其无效当模型实体改变时它们会自动出现。这种方法似乎是一个很好的起点,可以强制执行 CQRS 接口(interface)/模式,但可以更改并且作为奖励可以支持动态投影(当用户选择要查看的列等时)。
最佳答案
总的来说,我不确定你具体提出的问题,所以我会尽力回答这些问题。我希望这有帮助。如果我错过了您的问题的重点,我会澄清一下-请告诉我。
命令可用性/验证 :
我不确定您对这部分的问题是什么,但本质上是您的用户行为决定了您可以使用哪些命令。该命令对于该特定用户是否有效可以由提交命令的 UI Controller (或任何机制)处理,也可以由接收命令的域处理。该命令应包含足够的信息,以便域对其进行评估,然后更改其状态并引发事件。
抵抗需求变化 :
如果实体发生变化,并非所有相关的读取模型都需要更改——这实际上取决于读取模型的目的。维护读取模型的一些方法可能是为每个相关的读取模型集使用不同的模式,或者使用命名标准(例如 ORDER_xxx)。我更喜欢前者,因为它更干净(至少从我的角度来看)。
读取模型和不修改域模型的命令 :
命令并不总是应该更新读取模型。如果域中的业务规则引发了处理和持久化的适当事件,他们可以更新读取模型。仅仅因为发出命令并不意味着读取模型将被更新。
如果您遵循 CQS(和 CQRS),那么您的命令不应返回结果。命令返回无效。命令是你告诉系统做某事。您所描述的是一个两步过程:发出命令,然后发出读取请求。读取请求很可能会产生“旧”数据(即在命令更新读取模型之前)。有几种方法可以处理这个问题。您可以进行投票 - 这不是一种非常优雅的方式,但它确实有效。您可以在发出命令后将用户带到中间页面(“谢谢您的订单,您想订购其他东西吗?”),然后当用户返回时,他们会看到他们更新的列表(因为命令有现在处理)。再次,不理想。但这就是最终一致性的本质。它没有真正的答案——它实际上是由您的用户如何与系统交互驱动的。
对于只是更新状态或与第三方系统交互的命令,难道不能在不让用户等待它们完成的情况下离线完成吗?我认为这是让您的系统反射(reflect)您的用户将如何使用系统的另一种情况。
读取模型表与内存缓存 :
如果你问这是否是一个好主意,我不太确定。您对这个内存缓存的出发点是什么?当系统重新启动时会发生什么——你的模型会发生什么?你重建它,你从哪里以及如何恢复状态?您是否为此使用事件溯源,并且您将重播上次快照中的所有事件以使您的域模型到位?
在不知道这些问题的答案的情况下,我无法给出答案。
关于design-patterns - 关于CQRS的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12196599/
我了解了 CQRS 的一般概念,但是当涉及到超越示例代码和幻灯片以处理现实世界问题时,我有一些问题。 验证 当您需要对涉及检查数据库值的命令进行验证时,您会怎么做? 注册一项服务,我必须输入一个唯一的
我目前正在尝试了解如何构建事件存储的内部结构。到目前为止我得到了什么: 一个事件存储有两个表(集合,...),一个用于聚合,一个用于事件。 聚合表包含以下数据:aggregateId (可能是一个 G
我最近阅读了很多关于 CQRS 的文章,对我来说,它似乎与 Event Sourcing 密切相关。 但就像这个答案说的https://stackoverflow.com/a/9217461/2770
我有 CQRS+ES 设计的应用程序。这是我在过去一年里一直在 CQRS+ES 世界中阅读的新内容,它非常有意义,但实现完美的意义并不总是那么容易。 无论如何,我的一个或多个问题是: 包含多个命令(步
我想知道如何在 CQRS 中创建多个聚合根。 示例:我有一个手机聚合根和 Simcard 聚合根。身份证 这些聚合应该是订阅聚合根的一部分。 我需要创建一个基于 SimCard 的订阅聚合,并且系统中
用户在我们的站点上注册并登录。RegisterUserCommand 被发送到异步命令处理程序。 用户想要更改他们的地址,但 RegisterUserCommand 尚未处理。系统中没有用户记录。 这
事件溯源和 CQRS 很棒,因为它使开发人员摆脱了一个预先建模的数据库的困扰,除非有大数据迁移项目,否则开发人员必须在应用程序的整个生命周期中使用该数据库。 CQRS 和 ES 还具有其他好处,例如扩
我想我理解了 ES + CQRS 上下文中读取模型的思想(如果不正确请指正)。然而,我对在“严肃”报道的背景下使用它仍有一些疑问。假设我使用关系数据库和一些 ORM 来处理我的读取模型。一个基本的“摘
我正在使用 Akka 持久性实现 CQRS 系统,并且我正在尝试了解 CQRS 的请求响应位。 关于如何将响应发送回客户端和 this article 的答案很少。还提到了一些不错的模式。但是,不是使
在基于 CQRS/ES 的系统中,您将事件存储在事件存储中。这些事件涉及一个聚合,并且它们相对于它们所属的聚合有一个顺序。此外,聚合是一致性/事务边界,这意味着任何事务保证仅在每个聚合级别上给出。 现
根据CQRS à la Greg Young ,事件处理程序(和下游事件反规范化器)对事件发布者之前发布的传入事件使用react。 现在让我们假设在运行时我们想要添加一个新的事件反规范化器:基本上,这
是否存在单个命令导致 CQRS 中有多个事件的情况?任何人都可以举一个例子吗? 我问是因为聚合是事务边界,编写聚合的实现取决于这个问题的答案。 最佳答案 是的,例如考虑命令 AssignUserToG
大概我们可以通过应用相同的命令集来恢复状态,那么为什么不简单地存储命令而不是事件呢? 最佳答案 事件,传达“这发生在我们的系统中”。当一个命令被接受和处理时,事件就会发生。没有人可以拒绝或改变它发生的
我正在学习什么是CQRS模式,并了解到还有CQS模式。 当我尝试搜索时,我发现了很多关于CQRS的图表和信息,但没有找到太多关于CQS的信息。 CQRS 模式中的关键点 在 CQRS 中,有一种要写入
我的CQRS / ES设计中有时间问题。为了便于讨论,让我们基于Microsoft的 有关此主题的示例, session 管理(https://msdn.microsoft.com/en-us/lib
我只是想知道我将尝试实现的设计是否有效 CQRS。 我将有一个查询处理程序,它本身会向其他子处理程序发送更多查询。它的主要任务是聚合来自多个服务的结果。 从处理程序内部发送查询可以吗?我已经可以在我的
我第一次尝试使用 CQRS 和事件溯源,我有几点需要一些指导。我想实现一个 SO 风格的声誉系统。这似乎非常适合这种架构。 以 SO 为例。假设一个问题被投票,这会生成一个 UpvoteCommand
我的问题与this one有关.虽然相关的问题和答案说明了我们为什么要将它们分开,但我想确保我对意图的理解是正确的。在我见过的所有示例中,命令的意图似乎是它可以被拒绝,并且它更新内存中的对象,然后事件
这更像是一个与 CQRS 和 Axon 相关的理论问题。下面是一个不言自明的设置,代码是 伪代码 ,它并不意味着编译。 假设为了处理来自聚合“Foo”的命令,我们首先需要查询另一个聚合“Bar”的状态
亲们,我正在考虑将 Dapper.net 等 microORM 用于 CQRS 应用程序 (Asp.Net MVC) 的读取访问组件,并使用 Entity Framework 来操作域。 这是 CQR
我是一名优秀的程序员,十分优秀!