2015-02-06 184 views
3

Folks, 我想在我们的Java API和NodeJS API之间建立一个消息队列。 在阅读了使用aws-sdk的几个示例之后,我不确定如何使服务监视队列。NodeJS和AWS SQS

例如,这篇文章Using SQS with Node: Receiving Messages Example Code告诉我使用sqs.receiveMessage()接收和sqs.deleteMessage()删除消息。

什么我不清楚,是如何包装成连续运行,服务,它不断采取关闭消息的SQS队列,它们传递给模型,将它们存储在蒙戈等

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

答案与使用类似sqs-poller一样简单吗?我将如何在已运行的NodeJS Express应用程序中实现相同的功能?很可能我应该研究SNS,以免在消息传输中有任何延迟。

谢谢!

+2

你需要实现一个工人,其永远不变,并检查你的队列!另一种解决方案是使用像Redis这样的键值数据库,它可以帮助您查看是否有任何新消息(如果两个API位于同一台服务器上,则可以实现第二个) – user385729 2015-02-06 04:28:23

回答

5

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

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

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

我不确定这件事,但如果你想收到物品的通知,你可能想看看亚马逊SNS。

+1

对于在2017年返回此问题的用户或后来;现在在大多数地区都有FIFO(先进先出)队列。在[AWS博客]上详细了解它(https://aws.amazon.com/blogs/aws/new-for-amazon-simple-queue-service-fifo-queues-with-exactly-once-delivery-deduplication /)。 – Bram 2017-01-20 20:50:17

4

当编写应用程序来消耗来自SQS的消息我用SQS-消费

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