是否可以将 spring 状态机与事件源模式结合起来?

Is it possible to combine spring statemachine with event sourcing pattern?

我的想法是通过 spring 状态机跟踪域对象的状态。即状态机定义如何传输域对象的状态。当事件是 persisted/restored to/from 事件存储时,可以通过将事件发送到状态机来(重新)生成域对象的状态。

但是,创建一个状态机对象似乎比较昂贵,每当域对象上发生状态转换时创建状态机对象的性能并不高。如果我只维护一个状态机对象,我会担心并发问题。一种方法是使用 'statemachine-pool',但如果我必须为多个不同的域对象创建统计机器,它就会变得混乱。

那么应用 spring 具有事件源模式的状态机是个好主意吗?

假设所有的转换都是基于事件我会说这是一个很好的主意,是的。

The fundamental idea of Event Sourcing is that of ensuring every change to the state of an application is captured in an event object, and that these event objects are themselves stored in the sequence they were applied for the same lifetime as the application state itself.

关于事件溯源的要点是您存储导致特定状态的事件 - 而不是仅存储当前状态 - 这样您就可以在给定的时间点重放它们。

因此,使用事件溯源对您创建状态机的方式没有影响。

However, it seems that creating a state-machine object is relatively expensive, it's not that performant to create a state-machine object whenever a state transition happened on a domain object.

每次状态转换时创建状态机与事件源无关。如果您只存储当前状态,您会采取不同的做法吗?在应用转换之前,您仍然需要从上次存储的状态创建状态机 - 或者在缓存或池中查找它。

使用事件溯源对性能造成的唯一影响是从头开始重放转换以达到当前状态。现在,如果这样做的成本很高 you can use snapshots,则可以最大限度地减少必须重播的转换次数。