mur*_*lai 10 events amazon-sqs node.js
在我详细解释问题之前,我告诉你我目前的做法.
我有一个运行setInterval()的js脚本.每个间隔,我都会调用SQS从队列中获取消息.如果有消息,那我就处理它.
所以,它将无限运行,直到我杀死进程.
我之前也构建了一个节点服务器(使用nodejs.org中的示例)
所以,我想知道的是,...而不是定期运行setInterval.有没有办法,如果SQS中有新消息,那么它会触发事件并处理消息?
这个问题超过2年......但是有一个比改变轮询间隔更好的方法.而是将队列的接收消息等待时间设置为最多20秒.然后您可以进行连续轮询,但在队列为空时每分钟只发出3个请求.当队列中有数据时,响应将立即生效.
您可以使用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)
在幕后,它已经使用了上述长轮询技术。