我如何让nodejs服务器监听AWS SQS?

在详细解释问题之前,我先告诉你我目前的做法。

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

我之前也build立了一个节点服务器(使用nodejs.org中的例子)

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

       

网上收集的解决方案 "我如何让nodejs服务器监听AWS SQS?"

不可以。您必须要求SQS发送一条消息。

看看SNS,如果你真的需要推送通知。 如果您希望在将消息添加到队列后向服务器提供轮询SQS的提示,则SNS会很好地工作。

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

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

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

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

您可以使用SQS长轮询来实现这一点。 长轮询通过允许Amazon SQS在发送响应之前等待消息在队列中可用,从而减less空响应的数量。 这也将大大降低SQS的成本。

为了方便sqs-consumer有一个叫做sqs-consumer的优秀图书馆。 它允许你定义一个接收SQS消息并在消息处理完成后调用callback的函数:

 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(); 

在引擎盖下它已经使用了上面描述的长轮询技术。