【问题标题】:NodeJS and AWS SQSNodeJS 和 AWS SQS
【发布时间】:2016-11-17 16:25:23
【问题描述】:

各位, 我想在我们的 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,以免消息传输出现任何延迟。

谢谢!

【问题讨论】:

  • 您需要实现一个工作人员,它会一直检查您的队列!另一种解决方案是使用像 Redis 这样的键值数据库,它可以帮助您查看是否有任何新消息(如果两个 API 在同一台服务器上,第二个是可行的)

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


【解决方案1】:

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

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

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

对此我不确定,但如果您想收到物品通知,您可能需要查看 Amazon SNS。

【讨论】:

  • 适用于2017年或以后返回此问题的人;现在大多数地区都有 FIFO(先进先出)队列。在AWS blog 上阅读更多相关信息。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2017-10-01
    • 2011-06-19
    • 2018-12-28
    • 2019-07-01
    • 2020-06-14
    • 2015-08-07
    • 2019-09-19
    • 2020-08-06
    • 2020-07-28
    相关资源
    最近更新 更多