NodeJS 和 AWS SQS

NodeJS and AWS 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,以免消息传输有任何延迟。

谢谢!

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

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

简而言之,您可以通过多种方式进行轮询,但如果您使用的是 Amazon SQS,则必须以一种或另一种方式进行轮询。

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

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