对于CQRS/EventSourcing应用程序,我们使用来自akka-persistence 2.6.15的EventSourcedBehavior,使用akka-persistence-JDBC4.0.0在PostgreSQL DB中存储事件和快照。
我们有用快照序列化的状态类。但有时这些状态类会发生变化,这使得读取快照明显失败。我们通过删除更改的快照来管理它:
delete from snapshot sn
where sn.persistence_id::uuid in (select id from some_entity_table); 但是对于具有大量事件的实体,当发送新命令时,需要花费大量时间才能获得最新的快照,从而导致超时。
是否有可能在应用程序启动时强制重新生成快照?
发布于 2021-12-10 16:54:48
可以说,这方面的“真正”解决方案是使用SerializerWithStringManifest,它可以将以前的快照格式反序列化为当前格式。如果使用反射驱动的序列化,这可能会更困难。它也不会迁移现有的快照。
您可以做的一个技巧是在持久参与者的协议中添加一个显式的ForceSnapshot命令。这在经典API中非常容易,在这里,您可以更好地控制快照,所以我不会再讨论这个问题。然而,在EventSourcedBehavior类型化的API中,这需要添加一个SnapshotForced事件并更改snapshotWhen函数以返回true (如果事件是SnapshotForced )。
无论是经典还是类型化,您都可以让应用程序通过利用persistenceId持久性查询来强制每个currentPersistenceIds写入一个新快照:
val readJournal =
PersistenceQuery(system).readJournalFor[JdbcReadJournal](JdbcReadJournal.Identifier)
val everythingSnapshotted =
readJournal.currentPersistenceIds()
.mapAsync(parallelism) { id =>
// use the ask pattern to send a `ForceSnapshot` command and wait for reply
???
}
.runWith(Sink.ignore)https://stackoverflow.com/questions/70301836
复制相似问题