【发布时间】:2015-11-01 04:45:52
【问题描述】:
我正在使用 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
}
}
正如您所见,进程的映射存储在内存中,因此如果进程数量很大,应用程序可能会耗尽内存。
【问题讨论】:
-
过去几个月我一直在研究 ES,我认为你真的应该尝试拥有一个 ProcessRootAggregate,它会产生其他子 ProcessAggregates,而不是将所有进程存储在一个 PersistentActor 中。您的 ProcessRootAggregate 应该向它的所有子角色 (ProcessAggregates) 发送消息以执行一些计算。看看这个模板github.com/ScalaConsultants/akka-persistence-eventsourcing。
标签: event-sourcing akka-persistence