在我详细解释问题之前,我告诉你我目前的方法。如何让nodejs服务器监听AWS SQS?
我有一个运行setInterval()的js脚本。 和每个间隔,我将调用SQS从队列中获取消息。如果有消息,我就处理它。
所以,它会无限运行,直到我杀死进程。
我还建立之前,节点服务器(使用nodejs.org的例子)
所以,我想知道是..而不是具有setInterval的定期运行。有没有办法,如果SQS中有新消息,那么它会触发事件并处理消息?
在我详细解释问题之前,我告诉你我目前的方法。如何让nodejs服务器监听AWS SQS?
我有一个运行setInterval()的js脚本。 和每个间隔,我将调用SQS从队列中获取消息。如果有消息,我就处理它。
所以,它会无限运行,直到我杀死进程。
我还建立之前,节点服务器(使用nodejs.org的例子)
所以,我想知道是..而不是具有setInterval的定期运行。有没有办法,如果SQS中有新消息,那么它会触发事件并处理消息?
不可以。您必须向SQS申请一条消息。如果您确实需要推送通知,请查看SNS。如果您希望在向队列中添加消息后向服务器提供轮询SQS的提示,则SNS会很有效。
SQS不提供通知,但是如果在SQS中有新消息,您是否可以创建消息,还可以点击node.js并打开几分钟轮询。您可能无法控制队列中的内容,但如果您是这样,我也会触发您的node.js开始轮询队列。
如果您因为成本而担心投票,您可以按我所做的来动态地更改您的投票时间。我的SQS队列每5秒钟轮询一次。如果节点检测到一条消息,它会立即将轮询时间降低到200ms几秒钟。如果它没有在队列中检测到消息,则它会在每次空请求时减速50ms,直到5秒轮询被再次命中为止。
第一个请求将会很慢,您可能无法处理。为了解决这个问题,我的投票时间每隔几分钟就会随机加速。通过少数节点轮询,响应时间通常非常快。
这个问题已经超过2年了..但是比改变你的轮询间隔有更好的方法。而应将队列的接收消息等待时间设置为最多20秒。然后,您可以进行连续轮询,但只能在队列为空时每分钟发出3个请求。当队列中有数据时,响应将立即生效。
您可以使用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();
在它已经利用上述的长轮询技术的发动机罩。
这将是很好,如果你可以张贴动态轮询时间的一些工作代码为例。 – Mark 2012-11-25 02:41:25