5

私の状態が潜在的に非常に大きい (RAM に収まらないとしましょう) いくつかのエンティティのリストであるサービスを実装しようとして、akka 永続化で遊んでいます。ユーザーがすべてのエンティティのすべての履歴を利用できるようにしたいとします。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
  }

}

ご覧のとおり、プロセスのマップはメモリに保存されるため、プロセスの数が多くなると、アプリケーションがメモリ不足になる可能性があります。

4

3 に答える 3

-1

あなたが探しているのは(少なくとも別のオプションです)スナップショットだと思います。

イベント ソーシングとイベント応答を使用する場合、一般的に推奨されるアプローチは、スナップショットを頻繁に使用することです。

したがって、イベントを取得すると、スナップショットが返され、そのスナップショット以降に発生したイベントが返されます。これは、イベント ストレージからストリーミングされるオブジェクトが少なくなり (メモリが少なくなり)、処理および適用するものが少なくなることを意味します (高速化)。ただし、これには独自のトレードオフがあります。ここでは説明しません。

これも、最も一般的なシナリオのみをカバーしています。イベント処理が変更された場合、イベントを再構築する必要があるかもしれません... ただし、これにより、システムの構築方法についてかなり深刻で興味深い質問が発生します。

あまり詳しく見ていませんが、akka にはこのスナップショットの概念が組み込まれている可能性があります。そうでない場合は、学習曲線があり、多くの試行錯誤が先の道にあり、理想的なアプローチではあまり旅されていない道をたどり始めますが、現実の世界はあなたに投げかけます.

于 2015-10-22T18:28:38.360 に答える