[英]Handling large number of outbound HTTP requests
如果我希望有大量來源,我正在構建一個提要閱讀器應用程序。 我會在給定的時間間隔(例如,每小時)內從每個源請求新數據,然后將響應緩存在我的服務器上。 我假設同時從所有來源請求數據不是最佳解決方案,因為我可能會遇到網絡擁塞(我很想知道是否還會有其他瓶頸)。
執行如此大量請求的有效方法是什么?
謝謝
因為,任何給定的請求都沒有緊迫性,您只想確保定期點擊它們,您可以及時將所有請求分開。
例如,如果您有 N 個來源,並且您想每小時點擊一次,您只需創建所有來源的列表,並跟蹤下一個來源的索引。 然后,計算你可以在一個小時內完成每個請求的距離。
因此,如果您有 N 個請求每小時處理一次:
let listOfSources = [...];
let nextSourceIndex = 0;
const cycleTime = 1000 * 60 * 60; // an hour in ms
const delta = Math.round(cycleTime / listOfSources.length);
// create interval timer that cycles through the sources
setInterval(() => {
let index = nextSourceIndex++;
if (index >= listOfSources.length) {
// wrap back to start
index = 0;
nextSourceIndex = 1;
}
processNextSource(listOfSources[index]);
}, delta);
function processNextSource(item) {
// process this source
}
請注意,如果您有很多來源並且處理每個來源都需要一些時間,那么您可能仍然有多個來源同時“正在運行”,但這應該沒問題。
如果處理確實是 CPU 或網絡繁重,您將不得不密切關注您是否陷入困境並且無法在一小時內完成所有來源。 如果是這種情況,根據瓶頸問題,您可能需要更多帶寬、更快的存儲或更多的 CPU 應用於項目(可能使用工作線程或子進程)。
如果源的數量是動態的,或者處理每個源的時間是動態的,並且您已接近處理限制,則可以使該系統具有適應性,以便在它變得過於繁忙時,它會自動將事情分開一次以上一個小時,反之亦然,如果事情不那么忙,它可以更頻繁地訪問它們。 這將需要跟蹤一些統計數據並計算新的cycleTime
變量並在每次循環中調整計時器。
有不同類型的方法。 當您需要處理大量異步操作時,一個常見的過程是以其中 N 個在任何給定時間都在進行中的方式處理它們(其中 N 是一個相對較小的數字,例如 3 到 10)。 這通常可以避免任何本地資源過載(例如 memory 使用情況、sockets 在飛行中、帶寬等......),同時仍然允許您在網絡方面進行一些並行處理。 如果您想盡可能快地通過所有這些而不會使本地資源不堪重負,那么這將是您可能使用的方法類型,而前面的討論更多是關於及時將它們分開。
這是一個名為mapConcurrent()
的 function 的實現,它異步迭代一個數組,同時運行的請求不超過 N 個。 而且,這是一個名為rateMap()
的 function,它在它支持的並發控制類型方面更加先進。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.