12

在我详细解释这个问题之前,我告诉你我目前的方法。

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

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

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

4

4 回答 4

9

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

于 2013-06-17T13:48:00.927 回答
8

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

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

于 2011-02-02T04:00:17.490 回答
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();

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

于 2017-06-27T10:36:32.960 回答
3

SQS 不提供通知,但是如果 SQS 中有新消息,您是否可以让创建消息的任何内容也命中 node.js 并打开轮询几分钟。您可能无法控制队列中的内容,但如果您是,我希望它也会触发您的 node.js 开始轮询队列。

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

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

于 2011-10-12T16:23:01.720 回答