use*_*095 5 event-sourcing akka-persistence
我正在玩akka持久性试图实现一个服务,其中我的状态可能非常大(好吧,它说它不适合RAM)一些实体的列表.让我们说用户希望所有实体的所有历史记录都可用.我可以在akka持久性中做到这一点吗?
现在我的演员状态看起来像那样.
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
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,进程映射存储在内存中,因此如果进程数量很大,应用程序可能会耗尽内存.
有状态 Actor 使用 Akka 持久性来在 Actor 启动、JVM 崩溃后或由 Supervisor 重新启动或在集群中迁移时恢复其内部状态。在这种情况下,从长远来看,应用程序/JVM 可能会因 OutOfMemory 异常而崩溃。当这个参与者重新启动时,持久性恢复机制将在映射中重新创建进程的所有信息。但总内存又会很高,应用程序在运行时可能会再次崩溃。因此,在这种情况下,持久性无助于避免应用程序崩溃,除非您仅保留部分进程列表以减少内存。
所以首先你需要想办法解决这个内存异常。也许您可以尝试以下选项。
如果恢复期间要重放的消息列表太大,可以使用快照来减少状态恢复时间。
| 归档时间: |
|
| 查看次数: |
819 次 |
| 最近记录: |