1

次のような機能テストで単純なオーケストレーション エンジンを構築しようとしています。

object Engine {
  def orchestrate(apiSequence : Seq[Any]) {
    val execUnitList = getExecutionUnits(apiSequence) // build a specific list
    schedule(execUnitList) // call multiple APIs
  }

下で呼び出されるメソッド (getExecutionUnits と schedule) で、私が適用したパターンは、リスト (したがって、val ではなく var) をインクリメンタルに構築し、リストを繰り返し処理し、特定の API を呼び出し、いくつかのカスタム検証を実行するパターンです。それぞれに。

私は、scala のオブジェクトがシングルトンと同等であることを認識しています (したがって、私の場合、Engine のインスタンスは 1 つしかありません)。何百回ものオーケストレーション メソッドの呼び出しが同時に予想される場合、これが適切なパターンであるかどうか疑問に思っています。Engine オブジェクト内で他の内部変数を管理することはなく、メソッドで提供された引数に基づいて動作するだけです。スケジュール方式で10秒程度かかることを想定すると、同時アクセス時の挙動が気になります。client1、client2、client3 が同時にこのメソッドを呼び出した場合、2 つのクライアントがキューに入れられ、現在処理中のクライアントがブロックされますか?

ユースケースを処理するためのより安全な慣用的な方法はありますか? アクターを使用して「オーケストレーション」メソッドをまとめ、同時リクエストを処理することをお勧めしますか?

編集:明確にするために、2つのメソッド(getExecutionUnitsとschedule)が絶対に不可欠であり、順番に呼び出されます。さらに、スケジュール メソッドは順番に複数の API (1 から 10 の間の任意の場所) を呼び出すため、それらも順番に実行されることが重要です。現時点では、一度に 1 つの Api に取り組み、応答を待ってから、必要に応じて次の API に移動する単純な for ループがあります。

4

1 に答える 1

2

Engine オブジェクト内で他の内部変数を管理することはなく、メソッドで提供された引数に基づいて動作するだけです。

エンジンで変数を使用している場合、これは機能しません。ただし、あなたの説明からはそうではないようです:getExecutionUnitsメソッドにローカル変数があり、(おそらく)scheduleの戻り値で初期化されるローカル変数がありますgetExecutionUnits。このケースは問題ないはずです。

client1、client2、および client3 が同時にこのメソッドを呼び出すと、2 つのクライアントがキューに入れられ、現在処理中のクライアントがブロックされますか?

いいえ、同期を追加しない場合 (エンジン自体に状態がない場合は追加しないでください)。

アクターを使用して「オーケストレーション」メソッドをまとめ、同時リクエストを処理することをお勧めしますか?

1 つのアクターでラップすると、エンジンが 1 つのリクエストを処理している間、クライアントブロックされて待機します。

于 2014-08-11T05:43:04.373 に答える