2011-02-02 29 views
8

在我详细解释问题之前,我告诉你我目前的方法。如何让nodejs服务器监听AWS SQS?

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

我还建立之前,节点服务器(使用nodejs.org的例子)

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

回答

6

不可以。您必须向SQS申请一条消息。如果您确实需要推送通知,请查看SNS。如果您希望在向队列中添加消息后向服务器提供轮询SQS的提示,则SNS会很有效。

3

SQS不提供通知,但是如果在SQS中有新消息,您是否可以创建消息,还可以点击node.js并打开几分钟轮询。您可能无法控制队列中的内容,但如果您是这样,我也会触发您的node.js开始轮询队列。

如果您因为成本而担心投票,您可以按我所做的来动态地更改您的投票时间。我的SQS队列每5秒钟轮询一次。如果节点检测到一条消息,它会立即将轮询时间降低到200ms几秒钟。如果它没有在队列中检测到消息,则它会在每次空请求时减速50ms,直到5秒轮询被再次命中为止。

第一个请求将会很慢,您可能无法处理。为了解决这个问题,我的投票时间每隔几分钟就会随机加速。通过少数节点轮询,响应时间通常非常快。

+2

这将是很好,如果你可以张贴动态轮询时间的一些工作代码为例。 – Mark 2012-11-25 02:41:25

7

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

2

您可以使用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(); 

在它已经利用上述的长轮询技术的发动机罩。