私は長時間実行されているプロセスを持っています.2時間から1日としましょう。各プロセスは、更新メッセージでライフサイクルを開始し、さらに同時更新をリッスンし続けます。更新メッセージには、一意のターゲット識別子があります。
各プロセスをアクターで表現したい場合、アクターを初期化するにはどうすればよいですか? 更新メッセージの識別子の値に基づいて、アトミックな検索/作成操作を行う必要があることは明らかですか? これをscala/akkaで設計するにはどうすればよいですか?
これらのプロセス アクター (アクターなど) の管理を実行する単一のアクターをセットアップしますProcessManager
。このアクターは、特定のプロセス ID のプロセス アクターを取得するリクエストをサポートします。内部的には、その子が既に存在するかどうかを確認します。sender
存在する場合、その参照で応答します。そうでない場合は、それを作成し、sender
その参照で に応答します。このマネージャ アクターは、(すべてのアクターが行うように) メールボックスをシリアルに処理するため、ルックアップ/作成の競合状態について心配する必要はありません。これの非常に単純化された例:
case class GetProcessHandler(processId:Int)
class ProcessManager extends Actor{
def receive = {
case GetProcessHandler(id) =>
val name = s"proc_$id"
val handler = context.child(name).getOrElse(
context.actorOf(Props[ProcessHandler], name)
)
sender ! handler
}
}
class ProcessHandler extends Actor{
def receive = {
...
}
}
で開始アクターを指定できますapplication.conf
。そしてmain
、ActorSystem を使用して、プログラムでこれらのアクターを作成/初期化できます。