事件源系统是否需要事务发件箱?

Is a transactional outbox needed for event-sourced systems?

我说的是交易发件箱模式,如下所述:https://microservices.io/patterns/data/transactional-outbox.html

据我了解,如果您在一次交易中更新状态并发布相应的事件,则需要一个交易发件箱。

但是没有状态更新,只是发布事件的事件源系统呢?您甚至需要交易发件箱模式吗?

例如,如果我使用 AWS EventBridge 作为事件总线。将事件发送到总线要么成功要么失败。一旦事件在总线上,它们就可以以弹性、容错的方式进行处理。那么在这种情况下是否需要交易发件箱?

大多数事件溯源框架作为发件箱有效地工作。当实体发布事件时,该事件将保存在数据库(或事件存储)中,并且事件处理器会在需要时选择它。

所以回答你的问题:我会说不,因为事件溯源框架是一种非常高级的发件箱。

以防万一,仅当服务以事务方式仅持久存在于一个存储引擎(DB、Kafka 等)时​​,上述方法才有效。如果您必须与多个存储服务进行交互,根据消息系统的语义,事情可能会变得更加复杂。如果消息传递系统可以处理 send-at-least-once 语义,则不需要发件箱,但任何消费者都需要能够处理重复的消息。

But what about event-sourced systems, where there is no state update, just publishing events? Do you even need a transactional outbox pattern?

CQRS 的上下文中,“事件溯源”通常意味着您有一些持久的历史记录(也就是在某些存储设备中有“事件流”的持久副本)。

所以仍然有一个“状态更新”——因为当我们从瞬时内存中清除所有内容时,我们仍然希望有一个事件的副本来重建(我们需要它,因为我们已经发出的事件是我们在计算新事件时使用的输入)。

如果“保存事件供以后使用”和“发布事件”是两个不同的事务,那么您需要考虑失败模式:如果您在两个事务之间崩溃会怎样?

交易发件箱的动机类似于“如果我们不能保证发布最终会发生,我们也不想保存状态”。保存和发布成为(某种程度上)全有或全无的操作。


注意:通常,事件总线不支持first-writer-wins 保证用作事件store;这不是“保存事件以备后用”的好机制,因为您无法确保流中的事件不会相互矛盾。很难设计一个健壮的系统。

幸福之路不是问题。