是否可以将弹簧状态机与事件采购模式相结合?

时间:2015-12-03 15:58:03

标签: event-sourcing spring-statemachine

我的想法是通过spring statemachine跟踪域对象的状态。即statemachine定义如何转换域对象的状态。当事件被持久化/恢复到事件存储中时,可以通过将事件发送到状态机来(重新)生成域对象的状态。

但是,创建一个statemachine对象似乎相对昂贵,每当域对象发生状态转换时,创建状态机对象并不是那么高效。如果我只维护一个statemachine对象,我会担心并发问题。一种方法是拥有一个“状态机池”,但如果我必须为多个不同的域对象创建statamachines,它会变得混乱。

将spring statemachine应用于事件源模式是一个好主意吗?

1 个答案:

答案 0 :(得分:1)

如果所有转换都基于事件,我会说这是一个非常好的主意,是的。

  

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.

关于事件来源的要点是,您存储导致特定状态的事件 - 而不是仅存储当前状态 - 以便您可以将它们重播到给定的时间点。

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

  

但是,创建状态机对象似乎相对昂贵,只要在域对象上发生状态转换时创建状态机对象就不是那么高效。

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

使用事件源的唯一性能影响是从头开始重放转换以达到当前状态。现在,如果这是非常昂贵的you can use snapshots,以尽量减少必须重播的转换量。