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

mur*_*lai 10 events amazon-sqs node.js

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

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

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

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

bvs*_*bvs 8

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


ben*_*man 7

您可以使用SQS 长轮询来实现这一点。长轮询允许 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();
Run Code Online (Sandbox Code Playgroud)

在幕后,它已经使用了上述长轮询技术。


Uri*_*ter 6

不可以.您必须向SQS索取消息.

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