Transactions 事件源中的事务处理

Transactions 事件源中的事务处理,transactions,event-sourcing,Transactions,Event Sourcing,我正试图在活动采购中对交易了如指掌 我的事件存储中有一个聚合(事务范围) 一个命令被处理并产生10个事件。现在,这可以作为一个事务处理,还是这10个事务处理?对于事务,我指的是对状态的更改,它仅作为一个整体一起有效。即使我希望将事件作为一个整体来处理,但如果将它们拆分为许多这样的事件,我是否设计了错误的事件 我倾向于认为是命令定义了事务、意图,并且该命令产生的所有事件都应该作为一个整体一起处理。这意味着它们只能作为一个整体进行持久化、作为一个整体进行加载、作为一个整体对读者可见(原子级),也只能

我正试图在活动采购中对交易了如指掌

我的事件存储中有一个聚合(事务范围)

一个命令被处理并产生10个事件。现在,这可以作为一个事务处理,还是这10个事务处理?对于事务,我指的是对状态的更改,它仅作为一个整体一起有效。即使我希望将事件作为一个整体来处理,但如果将它们拆分为许多这样的事件,我是否设计了错误的事件

我倾向于认为是命令定义了事务、意图,并且该命令产生的所有事件都应该作为一个整体一起处理。这意味着它们只能作为一个整体进行持久化、作为一个整体进行加载、作为一个整体对读者可见(原子级),也只能作为一个整体发送给我的事件总线上的侦听器

这是正确的想法吗

例如,卡夫卡和事件存储是如何处理的

那么产生许多事件的命令呢,这真的是一个好的设计吗?我希望发生一些事情(命令)和发生了一些事情(事件),但发生的事情不多??我希望有这种1:1的关系,但我到处读到命令应该能够产生许多事件,但为什么

很抱歉这么漫无边际,我希望有人明白我想问的

一个命令被处理并产生10个事件。现在,这可以作为一个事务处理,还是这10个事务处理

作为写入,这通常被建模为单个事务;要么全部添加到历史记录中,要么什么都不添加

它们只应作为一个整体进行持久化、作为一个整体进行加载、作为一个整体对读者可见(原子性地),并且作为一个整体仅发送给我的事件总线上的侦听器

阅读方面的事情可能会有点棘手。毕竟,事件只是事件;作为一名消费者,我甚至可能对它们都不感兴趣,而且尽可能快地消费它们,而不是等待一切按顺序出现,这可能有商业价值

对于排序非常重要的消费者,在这些情况下,您将读取流,而不是事件。但仍然存在这样的情况,即使用者中可能存在批处理/分页问题,这与在提交边界上对齐所有工作的目标相冲突

需要记住的一点是,从读者的角度来看,没有需要维护的不变量。事件流只是发生的一系列事件

唯一真正关键的情况是编写器试图加载聚合状态;在这种情况下,您需要整个流,而提交边界基本上是不相关的

例如,卡夫卡和事件存储是如何处理的

在Greg Young的事件存储中,意味着将事件的有序集合复制到流中的指定位置。整个街区都进来了,或者根本没有

包括分页支持——允许客户端请求在提交边界之间运行事件。该文档无法保证在这种情况下会发生什么。事实上,返回的表示可以支持返回的事件少于可用的事件,因此事件总是在提交边界上返回

我从阅读中了解到,用于在磁盘上存储流的持久性结构并不试图保留提交边界,但在这一点上我肯定是错的

我希望有这种1:1的关系,但我到处读到命令应该能够产生许多事件,但为什么

有几个原因

首先,骨料是人造的;它们是我们用来确保日志中数据完整性的一致性边界。但是一个给定的聚合可以组成许多实体(例如,在低争用级别上,将整个域模型放入一个“聚合”并没有本质上的错误),并且将对不同实体的更改视为彼此不同通常是有用的。(另一种方法类似于每次编写一个SomethingChanged事件,并坚持所有客户端都使用该事件来发现发生了什么)

其次,重建域不变量通常是与命令中指定的操作分开的操作。鲍勃只是从他的账户中提取了比他可用的更多的现金;我们需要更新他的账户分类账并将问题上报给一个人。哦,这里有一个新的命令,描述了鲍勃今天早些时候的一笔存款,我们需要更新他的账户分类账,并告诉那个人停下来


但从广义上讲,因为区分一个命令的多种后果更符合业务的自然语言。

如果一个聚合的命令逻辑依赖于对其他聚合(或传说)的要求/检查,该怎么办?在这种情况下,如何处理(可能是分布式)事务?