2015-02-06 337 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