@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條消息並返回給客戶端。而異步的消費者將不斷地從隊列中拉出併發出請求:)
如果它們除了url之外沒有變化,您可以在循環中編寫它們。你需要提供的是一個包含所有230個URL的數組。 – kism3t
一個請求怎麼需要做230個webservice調用? – Kayaman
嗨kism3t ...你是對的,只有網址會有所不同。請你擴大你的答案。目前我的代碼正在運行一個循環,每次調用一個web服務。這種方法的問題是它需要很長時間。 – user2318704