And*_*ita 2 transactions event-sourcing
我正在努力把精力集中在事件源的交易上。
我的事件存储区中有一个聚合(事务作用域)。
命令被处理并产生10个事件。现在,可以将其视为1个事务还是10个事务?对于事务,我的意思是更改仅在整体上有效的状态。即使我希望将事件作为一个整体来处理,但如果将它们分成许多这样的事件,我是否将事件设计为错误?
我倾向于认为定义事务,意图的是命令,并且该命令产生的所有事件都应作为一个整体处理。这意味着它们仅应作为一个整体持久保存,作为一个整体加载,对读者整体(原子上)可见,并且也应作为事件总线整体发送给侦听器。
这是正确的想法吗?
例如在Kafka和Event Store中如何处理?
产生许多事件的命令又该如何设计呢?我希望发生一些事情(命令)和某些事情发生(事件),发生的事情并不多?我想拥有这种1:1关系,但是我在这里读到那里命令应该能够产生许多事件,但是为什么呢?
对不起,我希望有人能得到我在这里要问的问题。
命令被处理并产生10个事件。现在,可以将其视为1个事务还是10个事务?
作为写操作,通常将其建模为单个事务。要么将整个提交添加到历史记录中,要么不添加任何内容。
只能将它们作为一个整体持久保存,作为一个整体加载,作为一个整体对读者(在原子上)可见,并且还应作为整体在事件总线上发送给侦听器。
在读取方面的事情可能有点棘手。毕竟,事件只是事件。作为消费者,我什至对所有这些产品都不感兴趣,并且可能有商业价值,那就是尽快消费它们,而不是等待一切都井井有条。
对于订购量很大的消费者,在这种情况下,您将阅读信息流,而不是事件。但仍然是这样,在使用者中可能存在与批处理/分页有关的问题,这与在提交边界上对齐所有工作的目标相冲突。
要记住的一点是,从读者的角度来看,没有任何变量可以维护。事件流只是发生的一系列事件。
唯一真正关键的情况是写程序试图加载聚合状态的情况。在这种情况下,您需要整个流,并且提交边界基本上是不相关的。
例如在Kafka和Event Store中如何处理?
在Greg Young的事件存储中,写入流意味着将有序的事件集合复制到流中的指定位置。整个块都进来了,或者根本没有进来。
从流中进行读取包括分页支持-允许客户端请求一系列在提交边界之间的事件。该文档不保证在这种情况下会发生什么。碰巧的是,返回的表示形式可以支持返回的事件少于可用的事件,因此可能总是在提交边界返回事件。
通过阅读源代码,我的理解是,用于将数据流存储在磁盘上的持久性结构并未尝试保留提交边界-但在这一点上我肯定会被误解。
我想拥有这种1:1关系,但是我在这里读到那里命令应该能够产生许多事件,但是为什么呢?
有两个原因。
首先,骨料是人造的。它们是我们用来确保日志中数据完整性的一致性边界。但是给定的聚合可以组成许多实体(例如,在低竞争级别下,将整个域模型放入单个“聚合”没有内在的错误),并且将对不同实体的更改彼此区别对待通常很有用。 。(替代方法类似于每次编写SomethingChanged事件,并坚持要求所有客户端使用该事件以查明发生了什么)。
其次,重新建立域不变式通常是与命令中指定的操作分开的操作。鲍勃只是从他的帐户中提取了比他可用的更多的现金。我们需要更新他的帐户分类帐,并将问题升级为人类。哦,这是一条新命令,描述了Bob在当天早些时候进行的一笔存款,我们需要更新他的帐户分类帐,并告诉人们退位。
但是从广义上讲,因为区分命令的多种结果会更好地与业务的自然语言保持一致。