限制併發非阻塞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)
你正在測量資源利用率還是隻是一個問題?您是否更擔心操作系統資源消耗,或者您想避免淹沒目標服務? – marcospereira
我面臨一個例外情況,即使使用WS也要顯式管理資源。 – Mayumi
請編輯帖子,在發生的地方添加例外和代碼。 – marcospereira