使用 Node 轮询 Amazon SQS 队列的最有效方法

Posted

技术标签:

【中文标题】使用 Node 轮询 Amazon SQS 队列的最有效方法【英文标题】:Most effective way to poll an Amazon SQS queue using Node 【发布时间】:2015-09-27 00:17:13 【问题描述】:

我的问题很短,但我觉得很有趣:

我有一个来自 Amazon SQS 服务的队列,并且我每秒都在轮询队列。当有消息时,我会处理消息,处理完后,返回轮询队列。

有没有更好的方法?,某种触发器?或者您认为哪种方法最好,以及为什么。

谢谢!

【问题讨论】:

【参考方案1】:

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) => 
    console.log('Processing message: ', message);
    done();
  
);

app.on('error', (err) => 
  console.log(err.message);
);

app.start();

如果您需要更多信息,该文档已详细记录。您可以在以下位置找到文档: https://github.com/bbc/sqs-consumer

【讨论】:

【参考方案2】:

正如 Mircea 所说,长轮询是一种选择。

当您要求“触发器”时,我相信您正在寻找其他东西,而不是自己不断地轮询 SQS。如果是这种情况,我建议您查看 AWS Lambda。它允许您将代码放在云端,它会自动触发您配置的事件,例如 SNS 事件、推送到 S3 的文件等。

http://aws.amazon.com/lambda/

【讨论】:

【参考方案3】:

是的,有: http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-long-polling.html

您可以将 SQS 队列配置为具有“接收消息等待时间”并进行长轮询。

因此您可以将其设置为 10 秒,并且仅当您收到消息或 10 秒超时到期后,呼叫才会回来。在这种情况下,您可以连续轮询队列。

【讨论】:

但是一旦所有的消息都被消费完,不会像短轮询那样停止长轮询。您将不得不再次手动“拉”以获得下一批。 没有。长轮询不会停止。它仍然会超时轮询。因此轮询有效地阻塞,直到超时到期或您收到消息。

以上是关于使用 Node 轮询 Amazon SQS 队列的最有效方法的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Amazon SQS Spring 云注释 @SqsListener 轮询特定数量的消息

SimpleMessageListenerContainer Amazon SQS Pollinterval

Amazon SQS 延迟队列

Amazon SQS 死信队列:真的是死信还是毒药?

Amazon SQS 消息队列服务

Amazon-SQS + Django-Celery 创建了数千个队列(每条消息一个队列)