在详细解释问题之前,让我先告诉你我目前的做法。
我有一个运行 setInterval() 的 js 脚本。
在每个时间间隔,我都会调用 SQS 从队列中获取消息。如果有消息,我会处理它。
它会无限运行,直到我终止该进程。
我之前也构建过一个节点服务器(使用nodejs.org上的示例)。
所以,我想知道的是,有没有一种方法可以检测 SQS 中是否有新消息,然后触发事件并处理消息,而不是让 setInterval 无限运行?
这个问题已经有两年多了..但是有一个比改变轮询间隔更好的方法。 而是将队列的接收消息等待时间设置为最大值 20 秒。 然后你可以进行连续轮询,但在队列为空时每分钟只会发出 3 个请求。 当队列中有数据时,将立即响应。
不。您必须向 SQS 请求消息。
如果您确实需要推送通知,请查看SQS长轮询来实现这一点。长轮询允许 Amazon SQS 等到队列中有可用消息后再发送响应,从而减少空响应的数量。这也将显着降低 SQS 的成本。
为了让这一切变得简单,有一个名为 的优秀库。它允许您定义一个接收 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();
在幕后它已经利用了上述的长轮询技术。
如果您因为成本而担心轮询,您可以按照我的做法 - 动态更改您的轮询时间。我的 SQS 队列每 5 秒轮询一次。如果节点检测到消息,它会立即将轮询时间降低到 200 毫秒,持续几秒钟。如果它没有检测到队列中的消息,它会减慢每个空请求 50 毫秒,直到再次命中 5 秒轮询。
第一个请求会很慢,您可能无法处理。为了解决这个问题,我每隔几分钟就随机加快轮询时间。通过几个节点轮询,响应时间通常非常快。