Существует ли какая-либо настройка AWS, связанная с тем, сколько параллельных запросов с длительным опросом может обрабатывать Node.js? - PullRequest
0 голосов
/ 24 октября 2019

Я настраиваю новое приложение для длинных опросов сообщений с интервалом в 10 секунд от AWS sqs. Я пытался проверить это. И после 80 пользователей, которые ожидают своих запросов, задержка начала расти и достигла 15 секунд и достигла 30 секунд с 300 пользователями. Что-то не так с моим кодом или у 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 + '/');
});

Загрузка ЦП составила менее 10 процентов.

1 Ответ

0 голосов
/ 31 октября 2019

Вот подробная документация:

https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/node-configuring-maxsockets.html

При использовании https по умолчанию SDK получает значение maxSockets из globalAgent. Если значение maxSockets не определено или равно бесконечности, SDK принимает значение maxSockets, равное 50.

...