2011-02-02 11 views
8

prima di spiegare il problema in dettaglio, ti dico il mio approccio attuale.Come posso fare in modo che il server nodejs ascolti AWS SQS?

Ho uno script js che esegue setInterval(). e ogni intervallo, chiamerò SQS per ottenere il messaggio dalla coda. Se c'è un messaggio, lo elaborerò.
quindi, verrà eseguito all'infinito finché non avrò terminato il processo.

Ho anche costruito un server nodo prima (utilizzando l'esempio nella nodejs.org)

Allora, che cosa che mi chiedo è, .. invece di avere la setInterval per eseguire periodicamente. C'è un modo in cui se c'è un nuovo messaggio nella SQS, allora si accenderà un evento ed elaborerà il messaggio?

risposta

6

No. È necessario richiedere un messaggio da SQS.

Dai uno sguardo allo SNS se hai davvero bisogno di notifiche push. SNS funziona bene se vuoi dare al tuo server un suggerimento per interrogare SQS dopo aver aggiunto un messaggio alla coda.

3

SQS non fornisce la notifica, ma se c'è un nuovo messaggio nello SQS, si può avere qualsiasi messaggio creato anche hit node.js e attivare il polling per alcuni minuti. Potresti non avere il controllo di ciò che entra nella tua coda, ma se lo sei, vorrei che attivasse anche il tuo node.js per avviare il polling della coda.

Se si è preoccupati per il polling a causa dei costi, è possibile fare ciò che ho fatto: modificare dinamicamente il tempo di polling. Le mie code SQS vengono interrogate ogni 5 secondi. Se un nodo rileva un messaggio, il tempo di interrogazione viene immediatamente ridotto a 200 ms per alcuni secondi. Se non rileva un messaggio nella coda, rallenta di 50 ms ogni richiesta vuota, fino a quando non viene colpito nuovamente il sondaggio di 5 secondi.

Questa prima richiesta sarà lenta, qualcosa che potresti non essere in grado di gestire. Per combatterlo, ho i tempi di polling che aumentano a caso ogni pochi minuti. Con alcuni polling dei nodi, i tempi di risposta sono in genere molto rapidi.

+2

Sarebbe bello se fosse possibile inserire un codice funzionante del tempo di polling dinamico come esempio. – Mark

7

Questa domanda ha più di 2 anni .. ma c'è un modo molto migliore di cambiare l'intervallo di polling. Impostare invece il Tempo di attesa del messaggio di ricezione della coda per un massimo di 20 secondi. Quindi puoi eseguire il polling continuo ma effettuerai solo 3 richieste al minuto mentre la coda è vuota. Quando ci sono dati nella coda, la risposta sarà immediata.

2

È possibile utilizzare SQS Long Polling per ottenere ciò. Il polling lungo riduce il numero di risposte vuote consentendo ad Amazon SQS di attendere fino a quando un messaggio è disponibile in coda prima di inviare una risposta. Ciò ridurrà significativamente anche i costi per SQS.

Per semplificare, è disponibile un'eccellente libreria denominata sqs-consumer. Esso consente di definire solo una funzione che riceve un messaggio di SQS e chiama un callback quando il messaggio è stato elaborato:

const Consumer = require('sqs-consumer'); 

const app = Consumer.create({ 
    queueUrl: 'https://sqs.eu-west-1.amazonaws.com/account-id/queue-name', 
    handleMessage: (message, done) => { 
    // do some work with `message` 
    done(); 
    } 
}); 

app.on('error', (err) => { 
    console.log(err.message); 
}); 

app.start(); 

Sotto il cofano si fa già uso della tecnica di polling lungo sopra descritto.