Я использую нод, экспресс и оракул в качестве моей БД.Мое приложение работает нормально.Чтобы выполнить нагрузочное тестирование моего приложения, я запускаю Apache ab benchmark.Когда я пытаюсь выполнить параллельные соединения, скажем, 100 запросов, последняя пара запросов завершается неудачно, когда я отлаживаю с помощью регистраторов, я вижу, что request.on('close')
вызывается, а затем запрос завершает свое выполнение.Это происходит только для последних четырех-пяти запросов.Есть ли способ справиться с этим.Мой пул Oracle состоит из одного соединения.Я использую node-oracle для соединения.
https://github.com/oracle/node-oracledb
Моя кодовая база является клоном из https://github.com/oracle/oracle-db-examples/tree/master/javascript/rest-api/part-5-manual-pagination-sorting-and-filtering/hr_app
, ожидайте, что poolMax и poolMin равны 1.
Я запускаю команду Apache Benchmark.
ab -k -c 30 -n 200 http://localhost:3000/api/abc/91
В index.js я добавил ниже, чтобы отслеживать состояние http-запроса.Он переходит в код закрытия и затем печатает результат выполнения запроса.
const getLoggerForStatusCode = (statusCode) => {
if (statusCode >= 500) {
return console.error.bind(console)
}
if (statusCode >= 400) {
return console.warn.bind(console)
}
return console.log.bind(console)
}
const logRequestStart = (req, res, next) => {
req.requestId = token(true).substr(0, 8)
res.on('timeout', function () {
console.log("timeout! " + (options.timeout / 1000) + " seconds expired");
req.destroy();
});
req.on('error', function (err) {
console.log('request error'+ error);
});
console.info(`[${req.requestId}] ${req.method} ${req.originalUrl}`)
res.setTimeout(5000000, function () {
// call back function is called when request timed out.
console.log('server timed out');
});
const cleanup = () => {
res.removeListener('finish', logFn)
res.removeListener('close', abortFn)
res.removeListener('error', errorFn)
}
const logFn = () => {
cleanup()
const logger = getLoggerForStatusCode(res.statusCode)
logger(`[${req.requestId}] ${res.statusCode} ${res.statusMessage}; ${res.get('Content-Length') || 0}b sent`)
}
const abortFn = (err) => {
cleanup()
console.warn(`[${req.requestId}] Request aborted by the client ${err}`)
}
const errorFn = err => {
cleanup()
console.error(`Request pipeline error: ${err}`)
}
req.on('finish', logFn) // successful pipeline (regardless of its response)
req.on('error', errorFn) // pipeline internal error
req.on('close', abortFn) // aborted pipeline
next()
}
app.use(logRequestStart);
Я измерил время, и через 7 секунд после получения запроса соединение закрылось.