ファイルからプラグイン システムを介してプレイヤーのボット コードを読み込む、Scala で書かれたオープンソースのマルチプレイヤー プログラミング ゲームの場合.jar
、ボットのコードを制限付きで実行することにより、サーバー システムに害を及ぼさないようにしたいと考えています。SecurityManager
実装。
現在の実装では、URLClassLoader を使用して、関連するプラグイン .jar ファイルから各ボットの制御関数ファクトリを抽出します。次に、ファクトリを使用して、ゲームの新しいラウンドごとにボット コントロール関数インスタンスをインスタンス化します。次に、シミュレーション サイクルごとに 1 回、すべてのボット コントロール関数が同時に呼び出され、環境に対するボットの応答が取得されます。Future.traverse()
同時呼び出しは、暗黙的に提供ActorSystem
され、同時に動作する他のコンポーネント (コンパイル サービス、Web サーバー、レンダリング) によって共有されるAkka を使用して行われます。
val future = Future.traverse(bots)(bot => Future { bot.respondTo(state) })
val result = Await.result(future, Duration.Inf)
ボット プラグインに含まれる潜在的に悪意のあるコードの実行を制限するには、この StackOverflow の質問とこの質問で取られたパスに従って、適切に制限された実装の下で実行されるスレッドでボット制御機能を実行する必要があるようSecurityManager
です。
ここで問題です: システム内の他のアクタ(バックグラウンド コンパイル サービスを実行しているアクタなど) が現在と同じように実行し続けている間に、Akka が現在実行中の作業をFuture.traverse()
目的の を持つスレッドで実行されているアクターで処理するにはどうすればよいでしょうか?つまり無制限?SecurityManager