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

architecture - CQRS 意图命令事件

我正在创建一个 Web CRUD 应用程序,该应用程序在处理内部逻辑后会将事件发布到其他系统以更新其数据。

我正处于实施 CQRS 的第一步,我必须在只有一个“保存”按钮的表单中为用户的所有可能意图创建特定命令,这听起来很奇怪。这意味着很多命令(针对每个属性或值对象)来捕获我的需求中不需要但在即将订阅的项目中需要的意图。我喜欢只做我的有限上下文要求的事情。

另一件需要考虑的事情:我必须使用 session 来比较数据是否发生了变化。保存后伪造数据将隐藏在 UI 中显示错误数据的并发情况。

编辑:我刚刚发现这个线程Greg Young 建议某些屏幕只是 CRUD 并且将更新作为默认行为并没有什么不好。

0 投票
1 回答
1494 浏览

cqrs - 如何处理读取模型与事件日志不同步的情况?

当聚合的快照与事件日志不同步时,我可以简单地从早期快照(应该是同步的)重播我的事件。当我添加/删除新字段或修改现有处理程序的逻辑时,我也可以这样做。

如果我需要添加新的读取模型(即新的报告视图),我可以再次执行相同的操作 - 我将重播我的事件。

但是,当读取模型与事件日志不同步时,我应该如何处理这种情况?事件的存储和发布在一个事务中,但读取模型的更新发生在另一个事务中,这可能会失败。从一开始就重复事件会有所帮助,但它可能需要永恒。我是否需要整个读取模型的快照概念?

你怎么解决这个问题?谢谢你。

0 投票
1 回答
565 浏览

cqrs - 事件溯源和字典对象

事件溯源如何与多种类型的字典对象(如CountryRegion等)Time Zone以及来自特定域模型(如BudgetAvailability定义)的字典类型相结合。一些字典对象应该可以在管理 UI 中编辑,但有些不能。

例如,我们决定不需要国家/地区的管理 UI。因此我们不需要执行AddCountry/RemoveCountry命令。

我应该生成一组CountryAdded事件,即我应该将字典对象作为事件流保存吗?除了事件流,我们是否曾经使用过事实来源?


如果我可以不用字典对象的事件流,你将如何解决这个问题:

显示国家列表以及每个国家的用户数量。

在这种情况下,我需要Country用事件监听器来表示读取模型中的对象UserAdded

谢谢你。

0 投票
1 回答
2348 浏览

.net - 使用 DataContext.GetTable() 得到一个 'QueryProvider'

DataContext.GetTable() 方法将返回一个对象类型:

System.Data.Linq.Table

通过这样做,我假设我没有调用数据库来检索整个表。否则,LINQ 会有些低效。

因此,我所做的只是深入研究我的强类型 Datacontext 类(例如,dbDataContext)以获取例如它的“Customers”属性的句柄,该属性代表 SQL Server 中的 Customers 表。

然后,我可以从 GetTable() 返回的对象中获取 IQueryable,但仍然没有命中数据库。即,我的“服务层”代码将是 LINQ to Objects 而不是 Linq to Sql。

通过这样做,我将减少我需要的存储库的数量。

问题:

上述假设是否正确?

笔记:

我正在尝试找出一种方法来使用接口和泛型构建我的查询,以使其可测试以及所有这些。

因此,按照@zowen 对以下内容的回应进行思考:

存储库模式:每个实体一个存储库类?

我正在尝试实施

我知道不是绝对必要的,但我正在经历学习曲线并查看适合我的架构选项以及我的想法。

我正在尝试做的事情:

我正在尝试为 SQL Server 而不是 MongoDb 实现以下内容:

我想要的是获取 GetTable() 的句柄,然后针对它编写我的服务层 Linq 代码。

我怀疑我将不得不编写一个包装器接口来获取 IMongoDatabase 数据库变量的等价物。

但是,问题是上述问题,而不是其他问题。就像我说的,我只是在这里学习。在这部电影中,任何生产代码都不会受到伤害。

0 投票
8 回答
43619 浏览

java - 在 Java 中实现通用接口

我有一个 Java 泛型问题,希望有人能回答。考虑以下代码:

我想像这样实现这个 Handles 接口:

但是 java 不允许使用 Generic 实现 Handles 两次。我能够用 C# 完成此任务,但如果不使用反射或 instanceof 和强制转换,我无法在 java 中找到解决方法。

java中有没有办法使用两个通用接口来实现Handles接口?或者也许是另一种编写 Handles 接口的方式,以便可以完成最终结果?

0 投票
2 回答
2035 浏览

java - java世界中的CQRS

我关注关于 cqrs 的讨论很长时间了。

我突然想到的是,所选择的编程语言主要是在 dot.Net 世界中确定的。

有什么理由会出现这种情况吗?为什么 cqrs 的概念还没有嵌套在 java 世界中?是否有另一种概念/架构风格,可能在我还不知道的java平流层中命名不同?

0 投票
4 回答
1240 浏览

azure - 在 CQRS 中实现基于集合的约束

我仍在努力解决与 CQRS 风格架构相关的基本(和已解决)问题:

我们如何实现依赖于一组聚合根的业务规则?

以预订应用程序为例。它可以让您预订音乐会的门票、电影的座位或餐厅的餐桌。在所有情况下,只有有限数量的“物品”可供出售。

让我们假设某个事件或地点非常受欢迎。当新活动或时间段的销售开始时,预订开始很快到达 - 可能每秒很多。

在查询方面,我们可以大规模扩展,并将预订放在队列中,由自治组件异步处理。起初,当我们从队列中拉出保留命令时,我们将接受它们,但在某个时间我们将不得不开始拒绝其余的命令。

我们如何知道何时达到极限?

对于每个预订命令,我们都必须查询某种存储来确定我们是否可以容纳该请求。这意味着我们需要知道当时我们已经收到了多少预订。

但是,如果域存储是非关系数据存储,例如 Windows Azure 表存储,我们就不能很好地做一个SELECT COUNT(*) FROM ...

一种选择是保留一个单独的聚合根,它只跟踪当前计数,如下所示:

  • AR:预订(谁?多少?)
  • AR:事件/时间段/日期(总计数)

第二个聚合根是第一个聚合根的非规范化聚合,但是当底层数据存储不支持事务时,这些很可能在大容量场景中不同步(这是我们正在尝试的首先是地址)。

一种可能的解决方案是将保留命令的处理序列化,以便一次只处理一个,但这违背了我们的可扩展性(和冗余)目标。

这样的场景让我想起了标准的“缺货”场景,但不同的是我们不能很好地将预订放在延期交货上。一旦一个活动售罄,它就已经售罄,所以我看不出有什么补偿措施。

我们如何处理这样的场景?

0 投票
2 回答
8229 浏览

language-agnostic - 应用 CQRS 时如何在 create 中获取 ID?

我对 CQRS 的看法是,当您严格遵守命令时,不会返回任何内容(返回类型为 void),所以我的示例非常简单:创建内容时如何检索 ID?

例如,在创建信用卡交易时,返回交易 ID 似乎相当重要,或者在创建客户时,如果您获取您创建的客户或客户 ID 会更容易,这样浏览器就可以自动导航到该客户页面为例。

一种解决方案可能是首先要求一个 ID,然后使用该 ID 创建客户或交易,但这似乎很奇怪。

有没有人有这方面的经验或知道如何以最有效的方式完成?也许我误解了什么?

0 投票
2 回答
1258 浏览

cqrs - CQRS - 允许使用事件和其他信息源构建读取模型的依赖项

我的问题与 CQRS(命令和查询责任分离)和构建读取模型(视图)的机制有关。据我了解,读取模型是由事件处理程序构建的。这些处理程序(也称为非规范化程序)接收域事件并使用这些事件来构建不同的数据视图。

特定事件携带有关在域模型中完成的更改的信息。我认为在某些情况下,此信息不足以构建视图 - 即未更改的字段,未更改的实体在此类事件中丢失等。

所以我的问题是:

是否允许负责构建读取模型的非规范化程序不仅访问事件,还访问:

  1. 事件中直接引用的更改实体?
  2. 更改了聚合根以及与此聚合相关的任何实体?
  3. 从存储库中获取的任何实体?
  4. 有什么看法吗?

您对事件处理程序(非规范化程序)允许的依赖项有何看法?

编辑:刚刚在上面的问题中添加了简单的例子:

假设以下模型:

AR:ProductOffering * 名称 * 描述 * 类别 * 价格

AR: Customer * name * type * method: purchaseProduct(productOffering) 发出 ProductPurchasedByCustomer 事件

实体:ProductInstance * customer * productOffing

事件:ProductPurchasedByCustomer * customerId * productOfferingId

视图:ProductInventoryView * customerId * productOfferingId * customerType * productOfferingName * productOfferingCategory * price

如何仅使用 ProductPurchasedByCustomer 事件构建 ProductInventoryView?如何编写非规范化程序以查看有关 customerType、productOfferingName 等的信息?我应该从不同的视图中查找有关 customerType 和 productOfferingName 的其他信息吗?

0 投票
1 回答
2677 浏览

cqrs - CQRS & ElasticSearch - 使用 ElasticSearch 构建读取模型

有没有人使用 ElasticSearch 在 CQRS 方法中构建读取模型?我有一些与此类解决方案相关的问题:

  1. 您将域事件存储在哪里?在 JDBC 数据库中?在弹性搜索中?
  2. 您是通过处理域事件的事件处理程序还是使用 ElasticSearch River 功能来构建索引?
  3. 您如何处理视图模型的完全重建 - 例如,当视图损坏时?您是否处理所有事件以重建视图?