我正在设置一个新应用程序,用于从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%。
答案 0 :(得分:0)
这是详细的文档:
https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/node-configuring-maxsockets.html
使用默认的https时,SDK从globalAgent中获取maxSockets值。如果未定义maxSockets值或Infinity,则SDK会假定maxSockets值为50。