2016-04-22 10 views
0

HTTPクライアントのバインダーを調べると、それはdoes not supportコールバックの結果(DeferredResults)です。どのようにすれば、多くの時間を要するタスクを並列に実行するためのスケーラブルなエンドポイントを作成することができますか?このような何かを避けるためにしよう:先物なしでスケーラブルなソリューションを作成するには?

val slowComputation : Future[Array[Bytes] = ??? 

def endpoint = { 
    Await.result(slowComputation(), Duration(1, SECONDS)) 
} 
+0

あなたはScalaの並列コレクションあなたのコメントを – alifirat

+0

のおかげで外観を持つことができます。私はそれぞれのタスクが独立しているので、私はできるとは思えません。たとえば、要求ごとにオーディオファイルを変更します。それらは集約されませんが、処理され、それぞれのクライアントに返されます。 – tgk

答えて

1

が、私はこれを正しく理解しています:「DEFエンドポイントは」同期ブロッキング方法であり、そしてそれはフレームワークによって決まるので、あなたは、その事実を変えることはできませんか?

ここでは、計算/ IOがあなたに戻ってくるのを待ってブロックする必要があるということです。つまり、そこに1つのスレッドを使用することも意味します。

私は、多くの待機中のスレッドでエンドポイントを「オーバーロード」しないようにすることができます。したがって:

  • 同様にタイムアウトを指定します。
  • あなたが受け入れようとしている「待っているスレッド」がいくつあるか考えてみましょう。そして、多くの人が待っているならば、もっと多くのリクエストを流す。同様:
val waiting = new AtomicInteger(0) 
val maxThreadsWaiting = 200 

def endpoint() ={ 
    try{ 
     val numberThreadsWaiting = waiting.incrementAndGet() 
     if(numberThreadsWaiting > maxThreadsWaiting) { 
      // Return 'overload' failure. Like HTTP 503 
     } else{ 
      Await.result(slowComputation(), Duration(1, SECONDS)) 
     }  
    } finally { 
     waiting.decrementAndGet() 
    } 
} 
+0

ありがとうございましたGamlor、awesome notes、はい、ちょうど私はフレームワークによって制限されていますので、スレッドを何らかの方法で管理する必要があり、あなたのサンプルが役立つと聞いてうれしいです。 – tgk

関連する問題