Как я могу заставить сервер nodejs слушать AWS SQS? - PullRequest
10 голосов
/ 02 февраля 2011

Прежде чем я подробно объясню проблему, я расскажу вам о своем текущем подходе.

У меня есть js-скрипт, который запускает setInterval ().и каждый интервал я буду вызывать SQS, чтобы получить сообщение из очереди.Если есть сообщение, я его обрабатываю.
, поэтому оно будет работать бесконечно, пока я не убью процесс.

Я также создал сервер узлов ранее (используя пример в файле nodejs.org)

Итак, что мне интересно, это ... вместо того, чтобы периодически запускать setInterval.Есть ли способ, что если в SQS появится новое сообщение, оно сработает и обработает сообщение?

Ответы [ 4 ]

8 голосов
/ 17 июня 2013

Этим вопросам более 2 лет ... но есть гораздо лучший способ, чем изменить интервал опроса. Вместо этого установите Максимальное время ожидания получения сообщения в вашей очереди максимум 20 секунд. Затем вы можете выполнять непрерывный опрос, но будете делать только 3 запроса в минуту, пока очередь пуста. Когда в очереди есть данные, ответ будет немедленным.

6 голосов
/ 02 февраля 2011

Нет.Вы должны запросить сообщение от SQS.

Посмотрите на SNS , если вам действительно нужны push-уведомления.SNS работает хорошо, если вы хотите дать своему серверу подсказку для опроса SQS после добавления сообщения в очередь.

4 голосов
/ 27 июня 2017

Вы можете использовать SQS Long Polling для достижения этой цели.Длинный опрос уменьшает количество пустых ответов, позволяя Amazon SQS ждать, пока сообщение не станет доступным в очереди, перед отправкой ответа.Это также значительно сократит затраты на SQS.

Чтобы упростить эту задачу, есть отличная библиотека под названием sqs-consumer.Это позволяет вам просто определить функцию, которая получает сообщение SQS и вызывает обратный вызов, когда сообщение было обработано:

const Consumer = require('sqs-consumer');

const app = Consumer.create({
  queueUrl: 'https://sqs.eu-west-1.amazonaws.com/account-id/queue-name',
  handleMessage: (message, done) => {
    // do some work with `message`
    done();
  }
});

app.on('error', (err) => {
  console.log(err.message);
});

app.start();

Внутри него уже используется метод длинного опроса, описанный выше.*

3 голосов
/ 12 октября 2011

SQS не обеспечивает уведомление, но если в SQS есть новое сообщение, вы можете создать созданное сообщение, также нажать на node.js и включить опрос на несколько минут. Возможно, вы не контролируете то, что идет в вашей очереди, но если вы это сделаете, я бы также запустил ваш node.js, чтобы начать опрос очереди.

Если вы беспокоитесь об опросе из-за стоимости, вы можете сделать то, что я сделал, - динамически изменить время опроса. Мои очереди SQS опрашиваются каждые 5 секунд. Если узел обнаруживает сообщение, он немедленно сокращает время опроса до 200 мс в течение нескольких секунд. Если он не обнаруживает сообщение в очереди, он замедляет 50 мс каждый пустой запрос до тех пор, пока 5-секундный опрос не будет выполнен снова.

Этот первый запрос будет медленным, с чем вы, возможно, не сможете справиться. Чтобы бороться с этим, у меня время опроса случайным образом увеличивается каждые несколько минут. При опросе нескольких узлов время отклика обычно очень быстрое.

...