これは 2 つの部分からなる質問です。1 つは実装方法よりも設計に関する問題であり、もう 1 つは Akka の実装に関する問題です。
私は Scalatra を使用して、呼び出されたときに複数のソースから画像を取得し、操作して返す REST サービス エンドポイントを構築しています。これは潜在的に非常に長時間実行されるプロセスであり、単一の http 要求/応答サイクルで許容されるよりも長くなる可能性があります。
これについての私の考えは、呼び出しが行われると、一連の akka アクターを起動して画像リソースをプルし、結果を画像処理アクターに渡してスケーリングなどを行うというものです。最初のリクエスト自体は、何らかの種類の処理中の結果を返す別のエンドポイントへの後続のポーリング呼び出しを行うために使用できる処理 ID と、ポーリングを停止するようにクライアントに知らせるために利用可能な結果が他にあるかどうかを判断するためのフラグ。
私の質問は次のとおりです。
- これはデザインの観点から意味がありますか?
- このアプローチを使用する場合、処理された画像を取得するための後続の各リクエストは、クライアントが既に受信した画像を知るために、何らかの状態認識を備えている必要があります。この状態をどのように管理しますか?
- 私はこれを見たことがありませんが、長時間実行されるコメット スタイルの HTTP 要求は、この状況でポーリングするよりも理にかなっているでしょうか?
実装部分
上記のような設計になると仮定すると、私は Scalatra と Akka (または任意の Actor パラダイム) に非常に慣れていないため、いくつか質問があります。
わかりました、最初の 1 つは Scala/Scalatra 固有の質問だと思います。わかりました、私は akka http://www.scalatra.org/guides/async/akka.htmlの Scalatra ドキュメントを見ました。この例では、次のようにアプリケーションのブートストラップをセットアップしました:
// Get a handle to an ActorSystem and a reference to one of your actors
val system = ActorSystem()
val myActor = system.actorOf(Props[MyActor])
// In the init method, mount your servlets with references to the system
// and/or ActorRefs, as necessary.
override def init(context: ServletContext) {
context.mount(new PageRetriever(system), "/*")
context.mount(new MyActorApp(system, myActor), "/actors/*")
}
scalatra のブートストラップはアプリケーションの起動時に 1 回行われると想定しているため、system.actorOf(Props[MyActor]) は単一のインスタンスを作成しますか、それともリクエストごとに 1 つ作成しますか?
次に、MyActor クラス (またはより適切な名前) が次のことを行ったとします。
class MyActor extends Actor {
def receive = {
//Find the [ImageSearchingActor] actor in akka registry and send search message
case initiateSearchRequest: InitiateSearchRequestMessage => TODO
//Find free [ImageProcessingActors] in akka registry and send each Image url to process
case imageInformationFound : ImageInformationFoundMessage => TODO
//Persist the result to a cache, or data store with the ProcessingId that all message will pass
case imageProcessed : ImageProcessedMessage => TODO
}
}
この場合、画像を取得する場所が複数あるため、複数のアクタがこのデータを取得します。適切な画像が見つかると、複数のアクターが画像の処理に使用されます。私のデザインを使用する場合、特定の ProcessingId に対して使用可能な処理済みの画像がこれ以上ないことをどこかにフラグする必要があります。これは、特定の ProcessingId に対してすべての画像検索および画像処理アクターがいつ終了したかを知る必要があることを意味します。どうすればいいですか?
それは多くの質問でした。消費する情報が理にかなっているといいのですが。
乾杯。クリス。