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

19

我的问题很简短,但我认为很有趣:

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

是否有更好的方法?例如某种触发器?在您看来,哪种方法最好?为什么?

谢谢!

3个回答

29

一个方便易用的从SQS消费消息的库是sqs-consumer

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


第一行现在应该是:const { Consumer } = require('sqs-consumer'); - Falcon Stakepool

3

1
但是一旦所有消息都被消耗完,长轮询不会像短轮询一样停止。您将不得不手动再次“拉取”以获取下一批消息。 - Epirocks
1
不,长轮询不会停止。它仍然会在超时时间内进行轮询。因此,轮询实际上会阻塞,直到超时时间到期或者有消息到达。 - Mircea
我假设问题是,如何在一段时间内保持一致的轮询最佳实践或最佳模式,这样,例如,如果您使用具有20秒超时的长轮询,您将始终在旧轮询结束时立即开始新的轮询(无论是有消息还是没有)。至少,这是我试图回答的问题。我可以拼凑出一些东西来完成这项工作,只是想确保我是否以“正确的方式”进行操作,如果有的话。 - Jason

0

正如Mircea所提到的,长轮询是一种选择。

当您要求一个“触发器”时,我相信您正在寻找与自己持续轮询SQS不同的东西。如果是这种情况,我建议您查看AWS Lambda。它允许您将代码放在云中,并在配置的事件(例如SNS事件、推送到S3的文件等)触发时自动触发。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接