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
各位,
我想在我们的 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