NodeJS和AWS SQS

时间:2015-02-06 03:44:55

标签: node.js amazon-web-services express amazon-sqs

民间,   我想在Java API和NodeJS API之间建立一个消息队列。   在阅读了几个使用aws-sdk的示例后,我不确定如何让服务观察队列。

例如,本文Using SQS with Node: Receiving Messages Example Code告诉我使用sqs.receiveMessage()来接收和sqs.deleteMessage()删除邮件。

我不清楚的是,如何将其包装到一个连续运行的服务中,该服务不断地将消息从sqs队列中取出,将它们传递给模型,将它们存储在mongo中等。

希望我的问题不完全模糊。我对Node的经验主要在于Express.js。

答案是否像使用sqs-poller之类的东西一样简单?我如何在已经运行的NodeJS Express应用程序中实现相同的功能?很可能我应该调查SNS,以免在邮件传输方面有任何延迟。

谢谢!

2 个答案:

答案 0 :(得分:6)

首先,Amazon SQS是一个伪队列,它保证消息的可用性,但不保证FIFO方式的序列。如果您希望它以这种方式工作,您必须在您的应用程序中实现排序逻辑。

回到你的问题,必须在你的应用程序中对SQS进行轮询,以检查是否有新消息可用。我使用setInterval()在应用中实现了此功能。我会在队列中查询项目,如果没有找到任何项目,我会延迟下一次调用,如果找到一些项目,下一次调用将立即绕过setInterval()。这显然是一个非常原始的实现,您可以查看替代方案。当在SQS中找到新项目时,您的服务器上的子进程如何ping您的NodeJS应用程序?我认为您可以在不使用NodeJS的情况下将子进程实现为BASH中的观察者。如果已有npm模块,你也可以查看它。

简而言之,您可以通过多种方式进行民意调查,但如果您正在使用Amazon SQS,则必须以某种方式进行轮询。

我不确定这一点,但如果您想收到有关商品的通知,您可能需要查看Amazon SNS。

答案 1 :(得分:6)

在编写应用程序以使用来自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