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

问题描述 投票:0回答:4

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

我有一个运行 setInterval() 的 js 脚本。 在每个时间间隔,我都会调用 SQS 从队列中获取消息。如果有消息,我会处理它。
它会无限运行,直到我终止该进程。

我之前也构建过一个节点服务器(使用nodejs.org上的示例)。

所以,我想知道的是,有没有一种方法可以检测 SQS 中是否有新消息,然后触发事件并处理消息,而不是让 setInterval 无限运行?

events node.js amazon-sqs
4个回答
10
投票

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


8
投票

不。您必须向 SQS 请求消息。

如果您确实需要推送通知,请查看

SNS。如果您想在将消息添加到队列后向服务器提示轮询 SQS,则 SNS 效果很好。


7
投票
您可以使用

SQS长轮询来实现这一点。长轮询允许 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
投票
SQS 不提供通知,但如果 SQS 中有新消息,您是否可以让创建该消息的任何内容也访问 node.js 并打开轮询几分钟。您可能无法控制队列中的内容,但如果您可以,我也会触发您的 Node.js 开始轮询队列。

如果您因为成本而担心轮询,您可以按照我的做法 - 动态更改您的轮询时间。我的 SQS 队列每 5 秒轮询一次。如果节点检测到消息,它会立即将轮询时间降低到 200 毫秒,持续几秒钟。如果它没有检测到队列中的消息,它会减慢每个空请求 50 毫秒,直到再次命中 5 秒轮询。

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

© www.soinside.com 2019 - 2024. All rights reserved.