在我详细解释问题之前,我告诉你我当前的做法。
我有一个运行setInterval()的js脚本。
每个间隔,我都会调用SQS从队列中获取消息。如果有消息,那我就处理它。
所以,它将无限运行,直到我杀死这个过程。
之前我还构建了一个节点服务器(使用nodejs.org中的示例)
所以,我想知道的是,...而不是定期运行setInterval。有没有办法如果SQS中有新消息,那么它会触发事件并处理消息?
答案 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秒轮询。
第一个请求会变慢,你可能无法处理。为了解决这个问题,我的投票时间每隔几分钟就会随机加速。通过几个节点轮询,响应时间通常非常快。