首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当akka持久化中的状态类发生变化时,是否有可能重新生成快照?

当akka持久化中的状态类发生变化时,是否有可能重新生成快照?
EN

Stack Overflow用户
提问于 2021-12-10 08:43:56
回答 1查看 130关注 0票数 0

对于CQRS/EventSourcing应用程序,我们使用来自akka-persistence 2.6.15的EventSourcedBehavior,使用akka-persistence-JDBC4.0.0在PostgreSQL DB中存储事件和快照。

我们有用快照序列化的状态类。但有时这些状态类会发生变化,这使得读取快照明显失败。我们通过删除更改的快照来管理它:

代码语言:javascript
复制
      delete from snapshot sn 
      where sn.persistence_id::uuid in (select id from some_entity_table);       

但是对于具有大量事件的实体,当发送新命令时,需要花费大量时间才能获得最新的快照,从而导致超时。

是否有可能在应用程序启动时强制重新生成快照?

EN

回答 1

Stack Overflow用户

发布于 2021-12-10 16:54:48

可以说,这方面的“真正”解决方案是使用SerializerWithStringManifest,它可以将以前的快照格式反序列化为当前格式。如果使用反射驱动的序列化,这可能会更困难。它也不会迁移现有的快照。

您可以做的一个技巧是在持久参与者的协议中添加一个显式的ForceSnapshot命令。这在经典API中非常容易,在这里,您可以更好地控制快照,所以我不会再讨论这个问题。然而,在EventSourcedBehavior类型化的API中,这需要添加一个SnapshotForced事件并更改snapshotWhen函数以返回true (如果事件是SnapshotForced )。

无论是经典还是类型化,您都可以让应用程序通过利用persistenceId持久性查询来强制每个currentPersistenceIds写入一个新快照:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70301836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档