如何让nodejs服务器监听AWS SQS?

时间:2011-02-02 00:45:05

标签: events node.js amazon-sqs

在我详细解释问题之前,我告诉你我当前的做法。

我有一个运行setInterval()的js脚本。 每个间隔,我都会调用SQS从队列中获取消息。如果有消息,那我就处理它。
所以,它将无限运行,直到我杀死这个过程。

之前我还构建了一个节点服务器(使用nodejs.org中的示例)

所以,我想知道的是,...而不是定期运行setInterval。有没有办法如果SQS中有新消息,那么它会触发事件并处理消息?

4 个答案:

答案 0 :(得分:8)

这个问题已经超过2年了......但是有一个比改变轮询间隔更好的方法。而是将队列的接收消息等待时间设置为最多20秒。然后您可以进行连续轮询,但在队列为空时每分钟只发出3个请求。当队列中有数据时,响应将立即生效。

答案 1 :(得分:6)

没有。您必须从SQS请求消息。

如果您确实需要推送通知,请查看SNS。如果您希望在向队列添加消息后向服务器提供轮询SQS的提示,则SNS运行良好。

答案 2 :(得分:4)

您可以使用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 :(得分:3)

SQS不提供通知,但如果SQS中有新消息,您是否可以创建该消息,也可以点击node.js并开启轮询几分钟。您可能无法控制队列中的内容,但如果您是,我会让它触发您的node.js开始轮询队列。

如果您因为成本而担心轮询,您可以做我所做的事情 - 动态地改变您的投票时间。我的SQS队列每5秒轮询一次。如果节点检测到消息,它会立即将轮询时间减少到200毫秒,持续几秒钟。如果它没有检测到队列中的消息,则每个空请求都会减慢50ms,直到再次点击5秒轮询。

第一个请求会变慢,你可能无法处理。为了解决这个问题,我的投票时间每隔几分钟就会随机加速。通过几个节点轮询,响应时间通常非常快。