2016-04-19 67 views
0

限制併發非阻塞IO調用我一直在使用Play!Framework的WS來進行網絡調用。假設我在範圍內的自定義ExecutionContext中有5個線程。如果我要阻止網絡呼叫,最多可以處理5個並行請求,因此我可以明確限制網絡呼叫的數量。玩!框架:通過WS

當使用WS時,情​​況並非如此。它將使網絡調用超出5個線程,因爲它不會阻塞進行WS請求的自定義池。我所觀察到的是,我可以根據需要提出儘可能多的請求,並最終壓倒OS資源。示例代碼可以在下面找到。嵌套調用總共會產生100 * 100 = 10000次調用。 我的問題是,有沒有辦法限制WS(非阻塞IO)並行發生多少個調用?我能想到的唯一方法是在請求到達服務器之前進行負載平衡。謝謝!

val cols = (1 to 100).map { col => 
    ws.url(s"http://get-resource/${col}").get().flatMap { futureColResp => 
    val outerCol = futureColResp.json 

    val rowFutures = (1 to 100).map { row => 
     ws.url(s"http://get-resource/${row}").get().map { futureRowResp => 
     val innerRow = futureRowResp.json 
     doSomething(outerCol, innerRow) 
     } 
    } 
    Future.sequence(rowFutures) 
    } 
} 
Future.sequence(cols) 
+0

你正在測量資源利用率還是隻是一個問題?您是否更擔心操作系統資源消耗,或者您想避免淹沒目標服務? – marcospereira

+0

我面臨一個例外情況,即使使用WS也要顯式管理資源。 – Mayumi

+0

請編輯帖子,在發生的地方添加例外和代碼。 – marcospereira

回答