使用事件溯源技术是否适合使用FAT事件?

4

最近我在使用Greg Young EventStore作为我的持久层来构建一个应用程序,我一直在思考一个事件应该有多大?

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

UK_Address
-BuildingName
-Street
-Locality
-Town 
-Postcode

现在我正在使用React/Redux构建UI,我在思考是否应该创建一个包含所有上述字段的单个FAT addressUpdated事件?还是应该为每个不同的字段创建一个事件?并在客户端中批量处理它们,直到触发保存事件?例如:buildingNameUpdated事件、streetUpdated事件、localityUpdated事件。我不确定答案是否像我所问的那样黑白分明,我真正想知道的是,你可以使用什么条件/约束来做出决定?

可能是领域事件应该多细粒度的问题?的重复。 - guillaume31
4个回答

3
不需要为每个不同的字段创建事件。你的事件表示是API的一部分,因此你需要使用在业务层面上有意义的拼写,而不是在实现层面上有意义的拼写。
现在我正在使用React/Redux构建UI,想知道是否应该创建一个包含所有上述字段的单个FAT updateAddress事件?
你不需要限制发送到UI的数据与持久存储中的数据匹配。UI只是读模型的缓存表示;这个表示形式不需要与事件存储中的内容具有相同的形式。
考虑React模型本身-您的代码对数据的“内存”表示进行更改,然后库计算新的DOM并替换它,这反过来会导致浏览器更新其视图,从而导致屏幕上的像素发生变化。
因此,从存储中获取fat事件,并将其拆分为UI的字段级事件是可以的。从存储中获取多个事件并将其聚合为单个UI消息也是可以的。将事件从事件存储转换为UI将识别的拼写也是可以的。
关于Arien关于保持需要一致的字段在一起的答案,你有任何评论吗?因此,无论何时快照当前世界的状态,它都将处于有效状态?
我不认为这是有意义的,也不确定是否总体上可能这样做。
这是没有意义的,因为“有效状态”只涉及写模型;事件是已经发生的事情,现在投票是否有效太迟了。例如,如果您部署了一个新模型,并具有新的不变性,则它仍然需要尊重之前发生的历史记录。因此,您可以为该新模型构建快照,但快照可能不是“有效”的。太糟糕了。
鉴于此,我认为担心提交中每个单独事件是否将快照留在有效状态并没有意义。
特别是,如果特定交易涉及多个实体,则很可能领域语言会为每个实体提供一个事件(我们“借记现金”和“信用应收账款”)。当然,实体本身能够独立于彼此进行更改-它是聚合体维护平衡。

您对Arien关于将需要保持一致的字段放在一起的回答有何评论?这样,无论何时您快照当前世界的状态,它都将处于有效状态? - Madu Alikor
取决于你所说的是更新UI视图的消息,还是将数据输入分解为事件。你在这里提到“保存事件”,让我很难决定你要解决哪个问题;它们有非常不同的关注点。 - VoiceOfUnreason
我在问题中提到了Greg Young的EventStore,它是一个用于事件流的NoSQL数据库。 - Madu Alikor

2

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

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

例如:将地址(城市=1,街道=1,门牌号=1)更改为(城市=2,街道=2,门牌号=2)

如果您使用3个事件进行此操作,并且在阅读时仅处理了其中一个事件,则可能获得以下地址:(城市=2,街道=1,门牌号=1)。


0
如果感到困惑,可以尝试一种更容易实现的解决方案。我猜“FAT”事件会更容易:你最终将花费更少的时间来实现/调试/支持。
通常被称为YAGNI-KISS-Occam's Razor原则。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接