0
我已經遇到了這個問題之前幾個HTTP交易(如一百個左右的帖子)。今天我試圖做7k HTTP請求。這似乎很愚蠢,但它是與目標系統交互的唯一方式。我已經能夠做的最好的事情將在大約96%的請求中停頓。它會停下來,永遠不會完成最後幾個請求。如何在可能出錯時可靠地處理數千個HTTP請求?
也許我錯誤地使用了OiBackoff。它似乎工作正常,但最後3%的GETs將永遠不會完成。當日志中的最高重試間隔爲40秒時,我讓它設置爲5分鐘,沒有請求返回。
我不知道我是否應該像OiBackoff那樣一次完成100個請求,以確保它們全部完成。
這裏的目標是在最後打一個類似於CFD1234,CFD1236,CFD1238的URL,並將結果(小塊xml)推送到數組中。這是代碼,最接近我必須工作。也許我需要嘗試一個不同的庫?我已經嘗試過與承諾隊列,並不能讓它運行。它將工作,如果我創建一個函數閉包的數組並依次開火,但它需要永遠,比它應該更長。
var cnum, cnums, complete, ld, logger, oibackoff, opt, processHttpGet, request, responses, total, yamljs, _fn, _i, _len;
yamljs = require('yamljs');
request = require('request');
oibackoff = require('oibackoff').backoff({
maxTries: 10,
delayRatio: 10
});
cnums = yamljs.load('./etc/cnumbers.yaml');
responses = [];
logger = {
debug: console.log,
error: console.log
};
ld = require('lodash');
cnums = ld.uniq(cnums);
logger.debug("cnums len: " + cnums.length);
processHttpGet = function(url, opt, cb) {
return request.get(url, opt, function(error, resp, body) {
if (error != null) {
return cb(error, null);
} else if (resp.statusCode >= 400) {
return cb(resp.statusCode, null);
} else {
return cb(null, body);
}
});
};
opt = null;
total = cnums.length;
complete = 0;
_fn = function(CNumber) {
var intermediate, url;
url = "http://abc:[email protected]/xyz/def/abc.asmx/GetValueByID?ID=" + CNumber;
logger.debug("getting " + url);
intermediate = (function(_this) {
return function(err, tries, delay) {
if (err != null) {
logger.debug("GET failed for " + url + ":", err);
logger.debug("tries: %d, delay: %d", tries, delay);
}
if (tries > 10) {
logger.debug("/n/n Failed max tries.");
process.exit(0);
return false;
}
};
})(this);
return oibackoff(processHttpGet, url, opt, intermediate, function(error, response) {
if (error) {
return false;
} else {
++complete;
responses.push(response);
if (complete % 100 === 0) {
console.dir({
url: url,
response: response
});
}
logger.debug("success; responses complete: " + complete + ", total: " + total + ", percentage: " + (ld.round(complete/total, 2) * 100) + "%");
if (complete >= total) {
logger.debug(responses);
return process.exit(0);
}
}
});
};
for (_i = 0, _len = cnums.length; _i < _len; _i++) {
cnum = cnums[_i];
_fn(cnum);
}
哇,有什麼與downvotes!? – jcollum
也許人們認爲你正在努力調皮。我投了btw。 –
@AdamGent答案貼出來,原來很簡單,總覺得不錯 – jcollum