4

我最近一直在 Greg Young EventStore 之上构建一个应用程序作为我的持久层,我一直在思考我应该允许一个事件获得多大?

例如,我有一个包含以下字段的英国地址聚合

UK_Address
-BuildingName
-Street
-Locality
-Town 
-Postcode

现在我正在使用 React/Redux 构建 UI,并且正在考虑是否应该创建一个包含所有上述字段的 FAT addressUpdated 事件?

或者我应该为每个不同的字段创建一个事件?并在客户端内对它们进行批处理,直到触发 Save 事件?buildingNameUpdated 事件、streetUpdated 事件、localityUpdated 事件。

我不确定答案是否像黑白问一样我问过它我真正想知道的是您可以使用哪些条件/约束来做出决定?

4

4 回答 4

3

我应该为每个不同的字段创建一个事件吗?

不。您的事件表示是 API 的一部分——因此您希望使用在业务级别而不是在实现级别有意义的拼写。

现在我正在使用 React/Redux 构建 UI,并且正在考虑是否应该创建一个包含所有上述字段的 FAT updateAddress 事件?

您无需限制发送到 UI 的数据以匹配持久存储中的数据。UI 只是读取模型的缓存表示;没有理由让表示形式需要与您的事件存储中的形式相同。

考虑 React 模型本身——你的代码对数据的“内存中”表示进行更改,然后库计算新的 DOM 并替换它,这反过来会导致浏览器更新它的视图,这反过来又会导致屏幕上的像素来改变。

因此,从商店中获取一个胖事件,并将其分解为 UI 的字段级事件是可以的。从存储中获取多个事件并将它们聚合为 UI 的单个消息也很好。从事件存储中获取事件并将它们转换为 UI 可以识别的拼写也可以。

您对 Arien 关于保持需要保持一致的字段的回答有任何评论吗?因此,无论您的 snapshop 何时处于当前世界状态,它都会处于有效状态?

我不认为这是有道理的,而且我不确定总体上是否可行。

这没有意义,因为“有效状态”只是一个写模型关注点;事件是已经发生的事情,投票是否有效为时已晚。例如,如果您部署一个具有新不变量的新模型,它仍然需要尊重之前发生的历史。因此,您可以为该新模型构建快照,但快照可能不是“有效的”。太糟糕了。

鉴于此,我认为担心提交中的每个单独事件是否使快照处于有效状态是没有意义的。

特别是,如果特定交易涉及多个实体,那么领域语言很可能会为每个实体建议一个事件(我们“借记现金”和“贷记应收账款”)。当然,实体本身能够相互独立地改变——维持平衡的是聚合体。

于 2016-12-19T00:10:05.450 回答
2

当这些数据必须彼此一致时,您必须将所有信息捆绑在一个事件中。

因此,当您更新地址的一个字段时,您可能会得到一个不需要的地址。当客户端由于最终一致性而在某个时间没有处理所有事件时,就会发生这种情况。

示例:将地址 (City=1, Street=1, Housenumber=1) 更改为 (City=2, Street=2, Housenumber=2)

当您使用 3 个事件执行此操作并且在阅读时刚刚处理了一个事件时,您可以获得地址:(City= 2 , Street= 1 , Housenumber= 1 )。

于 2017-02-19T10:03:23.727 回答
0

如果感到困惑,请尝试更容易实施的解决方案。我猜“FAT”事件会更容易:你最终会花费更少的时间来实现/调试/支持。

它通常被称为 YAGNI-KISS-Occam 的剃刀原则。

于 2016-12-19T20:42:19.067 回答
0

理论上,我发现一个好的经验法则是让您的命令和事件反映用户忠于 DDD 的意图。您可以在此处找到有关事件粒度的优缺点的一个很好的解释:https ://medium.com/@hugo.oliveira.rocha/what-they-dont-tell-you-about-event-sourcing-6afc23c69e9a

于 2018-08-13T21:39:35.277 回答