2017-04-12 97 views
1

在我進一步深入之前,我想向您保證我已經盡了我的盡職調查並搜索了網絡上的建議/答案。特別是,我看了看下面的帖子:從Web應用程序中並行調用多個不同的Web服務

Calling Different Webservices in parallel from Webapp

在上面的帖子,你會看到user1669664有「做了大約15種webserivce從一個方法調用的所有。」

我已閱讀由matt提供的最佳答案。這個答案基本上需要爲每個不同的Web服務調用編寫一個Callable。

的事情是...

我有一個更大的規模類似的問題 - 我需要約230 Web服務調用。

我會很高興聽到意見/建議。我不想寫230個可卡因......!

謝謝。

+0

如果它們除了url之外沒有變化,您可以在循環中編寫它們。你需要提供的是一個包含所有230個URL的數組。 – kism3t

+0

一個請求怎麼需要做230個webservice調用? – Kayaman

+0

嗨kism3t ...你是對的,只有網址會有所不同。請你擴大你的答案。目前我的代碼正在運行一個循環,每次調用一個web服務。這種方法的問題是它需要很長時間。 – user2318704

回答

1

@Kayaman說什麼:)

什麼時間要求?你需要在X秒內成功執行所有的230次嗎?你怎麼樣控制默認的超時?所有請求是否需要導致200?如果一個請求失敗會發生什麼?你必須重試,直到成功?如果某些百分比失敗,您是否必須使所有其他請求無效?退休怎麼樣?

如果您不能以串行方式執行請求,則會留下某種併發代碼。併發代碼比同步代碼更困難。有太多的代碼路徑變體需要推理,同步的內存訪問或w/e。

如果您必須在Web請求的上下文中執行請求,那麼將併發(線程池)限制爲設定數量通常是個好主意。

如果硬編碼230是一個設定量,但仍然可能太大。如果這是一個公開可用的端點,則沒有任何東西阻止某人向您的服務器發起10,000個併發請求,並且如果您可以爲所有這些請求提供2,300,000個併發請求,而不是針對您的230個URL,那麼!!!!!!!!正因爲如此,所有的資源都應該有某種理智的界限。如果你從一個數據庫中取出url,並且任意一個用戶可能會添加無限制且不好的url。

一個簡單的方法是使用線程池來限制併發。

這個架構可能由一個有界線程池和一個隊列組成。當每個Web請求都進入時,它會排隊URLS並且線程池可以處理它們。如果你需要返回值,你可以有一個返回值隊列。我喜歡的是生產者(web請求處理程序)和消費者(線程池)都是以同步樣式編寫的,併發性是通過在線程池上執行fetchers來實現的。 Kayaman提到了一種常用於解決此問題的方法:將長時間運行的進程從Web請求的上下文中取出。這個架構可能看起來很像內部線程池和隊列,但會是進程間的。該隊列將是一個外部進程作業/消息隊列,消費者將從該隊列中拉出。然後,Web請求會觸發230條消息並返回給客戶端。而異步的消費者將不斷地從隊列中拉出併發出請求:)

+0

哇......謝謝你這樣詳細的回答,dm03514!正如前面的評論中所提到的,我對我所能做的事情非常勉強......可悲的是,我不能使用隊列。但我確實喜歡看網絡服務器的想法,也許會用默認的超時時間做一些事情。 – user2318704

+0

您應該可以在Web請求的上下文中內部使用隊列。 http://stackoverflow.com/a/2332581/594589 – dm03514

相關問題