![](/img/trans.png)
[英]What is the performance for Node.js' http.request ? How many concurrent request it can handle?
[英]Is there some kind of AWS setting that related with how many long-polling concurrent requests Node.js can handle?
我正在为来自 AWS sqs 的间隔为 10 秒的长轮询消息设置一个新应用程序。 我试过测试它。 在 80 个用户等待他们的请求后,延迟开始增长,达到 15 秒,300 个用户达到 30 秒。 我的代码有问题还是aws有某种类型的设置?
const port = process.env.PORT || 3001;
const express = require('express');
const app = express();
const AWS = require('aws-sdk');
AWS.config.update({region: 'eu-west-1'});
const MD5 = function(d){<md5function>}
const sleep = (waitTimeInMs) => new Promise(resolve => setTimeout(resolve, waitTimeInMs));
const SQS = new AWS.SQS({
region: 'eu-west-1'
});
const LONG_POLL_TIMEOUT = 10;
async function checkQueue(req, res) {
const {version, token} = req.params;
const auth = req.query.auth;
if (!isTokenValid(token, auth)) {
await sleep(LONG_POLL_TIMEOUT * 1000);
res.send()
} else {
getUpdateMessage(version, token, res);
}
}
function getUpdateMessage(version, token, res) {
const urlParams = {
QueueName: `_version-queue-${version}-${token}`
};
SQS.getQueueUrl(urlParams, (urlErr, urlData) => {
if (urlErr) {
res.status(204).send();
} else {
const messageParams = {
QueueUrl: urlData.QueueUrl,
WaitTimeSeconds: LONG_POLL_TIMEOUT,
};
SQS.receiveMessage(messageParams, (err, data) => {
if (err) {
res.status(204).send();
} else {
if (data.Messages) {
res.send(data.Messages[0].Body);
SQS.deleteMessage({
QueueUrl: urlData.QueueUrl,
ReceiptHandle: data.Messages[0].ReceiptHandle
}, (err1, data) => {
if (err1) {
}
});
} else {
res.send();
}
}
});
}
});
}
function isTokenValid(token, auth) {
// check against tokens for last 14 days
let dayNumber = Math.ceil(Date.now() / (24 * 3600 * 1000));
for (let i = 0; i < 14; i++) {
const stringToHash = `<string>`;
if (MD5(stringToHash) == auth) {
return true;
}
dayNumber--;
}
return false;
}
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
next();
});
app.get('/versions/:version/long_poll_updates/:token', function (req, res) {
checkQueue(req, res);
});
app.get('/check', function (req, res) {
res.send('I\'m ok!');
});
app.use((req, res) => {
res.status(404).send("Sorry, that route doesn't exist. Have a nice day :)");
});
app.listen(port, () => {
console.log('Server running at http://127.0.0.1:' + port + '/');
});
CPU 利用率低于 10%。
这是详细的文档:
https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/node-configuring-maxsockets.html
当使用 https 的默认值时,SDK 从 globalAgent 获取 maxSockets 值。 如果 maxSockets 值未定义或为 Infinity,则 SDK 假定 maxSockets 值为 50。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.