gpt4 book ai didi

event-sourcing - 当参与者状态仅增加大小时,我可以使用 akka 持久性吗?

转载 作者:行者123 更新时间:2023-12-03 18:03:21 25 4
gpt4 key购买 nike

我正在尝试使用 akka 持久性来实现一个服务,其中我的状态可能是一个非常大的(假设它不适合 RAM)某些实体的列表。假设用户希望所有实体的所有历史记录都可用。我可以在 akka 持久性中做到这一点吗?

现在我的 Actor 状态看起来像那样。

case class System(var processes: Map[Long, Process] = Map()) {

def updated(event: Event): System = event match {
case ProcessDetectedEvent(time, activitySets, id, processType) =>
val process = Process(activitySets.coordinates, time, activitySets.channels, id, processType, false)
copy(processes = processes + (id -> process))

case ProcessMovedEvent(id, activitySets, time) =>
val process = Process(activitySets.coordinates, time, activitySets.channels, id, processes(id).processType, false)
copy(processes = processes + (id -> process))

case ProcessClosedEvent(time, id) =>
val currentProcess = processes(id)
val process = Process(currentProcess.coordinates, time, currentProcess.channels, id, currentProcess.processType, true)
copy(processes = processes + (id -> process))
case _ => this
}

}

如您所见,进程的映射存储在内存中,因此如果进程数量很大,应用程序可能会耗尽内存。

最佳答案

Akka持久性被有状态actor用于在actor启动、JVM崩溃后重新启动或由主管重新启动或在集群中迁移时恢复其内部状态。在这种情况下,从长远来看,应用程序/JVM 可能会因 OutOfMemory 异常而崩溃。当这个 actor 重新启动时,持久性恢复机制将在映射中重新创建进程的所有信息。但是总内存又会很高,应用程序在运行时可能会再次崩溃。因此,除非您仅保留部分进程列表以减少内存,否则在这种情况下的持久性将无助于避免应用程序崩溃。

所以首先你需要想办法解决这个内存异常。也许您可以尝试以下选项。

  • 尝试在 OutOfMemory 异常后重新启动 JVM 期间增加 JVM 堆大小。
  • 在恢复状态时,只重放选定的消息列表,这样使用的总内存会很低,但状态是不完整的。

  • 如果恢复期间要重放的消息列表太大,可以使用快照来减少状态恢复时间。

    关于event-sourcing - 当参与者状态仅增加大小时,我可以使用 akka 持久性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33069786/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com