AWS SQS + SNS + Lambda


11

Mi chiedevo se posso inviare un messaggio alla coda SQS e sottoscrivere un argomento SNS per attivare un lambda per l'invio di un'e-mail.

SQS -> SNS -> (Lambda) -> SES

So che i messaggi SNS possono essere inviati a SQS ma sono curioso di sapere se è possibile il contrario

Risposte:


11

Una cosa che ho fatto è stata creare un allarme CloudWatch su ApproximateNumberOfMessagesVisible( >= 1 for 5 minutes) per la coda SQS. L'allarme pubblica un argomento SNS che attiva la funzione lambda. La funzione lambda esegue il loop fino a quando non cancella la coda.

L'allarme può richiedere fino a 5 minuti, ma funziona in modo fantastico per le attività pianificate in batch senza dover eseguire il polling della coda. (La granularità dell'allarme è di 5 minuti per le code attive.)


Sto pensando di fare esattamente la stessa cosa. Sai se ti viene addebitato ogni volta che cloudwatch controlla la tua coda? Non che stiamo parlando davvero di soldi con questo genere di cose, solo più curiosi.
Brian F Leighty,

Inoltre, presumo da quello che dici che l'allarme continua a inviare ripetutamente SNS dell'allarme? A cosa hai impostato il timeout sulla tua funzione lambda?
Brian F Leighty,

Un'altra cosa Ci scusiamo per tutti i commenti. Ero un po 'preoccupato per la parte "Approssimativa" hai mai avuto un momento in cui c'era un messaggio in attesa lì che non è stato risolto dal momento che pensava che ci fossero solo 0 articoli invece di 1 articolo lì?
Brian F Leighty,

@BrianFLeighty i controlli sono gratuiti. Ma non allarma continuamente; potrebbe essere necessario un secondo allarme per i messaggi in coda (aggiunto tra il completamento dell'esecuzione lambda e l'allarme successivo). Il polling può essere una soluzione migliore; il mio funziona per una coda in genere molto tranquilla (quindi non vale la pena di polling.)
squidpickles

Ha perso il commento "approssimativo". Sembra funzionare bene, ma ymmv
squidpickles il

7

Non puoi andare SQS -> SNS, solo SNS -> SQS.

Lambda ora supporta la pianificazione, quindi un'opzione è quella di implementare un poller SQS in una funzione Lambda ed eseguirlo frequentemente.

Un'altra opzione da considerare è se hai effettivamente bisogno di una coda. Lambda supporta l'elaborazione asincrona (tramite la modalità di chiamata Evento) e deve ridimensionarsi in modo trasparente in senso orizzontale per gestire le chiamate parallele. Se la tua funzione lambda non richiede l'accesso a un archivio di stato centrale che potrebbe limitare l'esecuzione in parallelo, probabilmente potresti semplicemente eseguire tutte le tue invocazioni in parallelo. Credo che ci sia un limite di esecuzione simultanea di 100 per account, quindi potrebbe essere necessario raggruppare i messaggi per rimanere al di sotto di questo.


3
non c'è nulla di sbagliato nell'usare i tradizionali trucchi del poller di coda con lambda: ad es. se lambda accoda un messaggio, durante l'esecuzione, quindi riattiva la funzione alla fine; altrimenti lascia che venga eseguito il prossimo come programmato
nik.shornikov il

1

SQSla coda può essere iscritta SNSall'argomento e quindi per elaborare i SNSmessaggi ricevuti . Attualmente, non è possibile farlo in un'altra direzione senza codifica aggiuntiva (vedere ad es. LambdaFAQ ).

Direi che ci sono un paio di opzioni su come farlo, ma non è così elegante come usare un sistema basato sugli eventi più comune AWS event->SQS->Lambda. Altrimenti potresti dover personalizzare / implementare il codice come SQSvengono elaborate le code:

  1. puoi implementare le tue fonti di eventi
  2. puoi avere un'istanza EC2 intermedia per ascoltare le SQScode e poi eseguire il trigger Lambdasu eventi SQS

0

Questo è stato chiesto e risposto un po 'di tempo fa, ma dopo averci pensato anche io, ho pensato di aggiungere un approccio.

Come accennato, le fonti di eventi potrebbero essere la migliore scommessa qui. In alternativa, e non l'ho ancora testato né pensato (quindi questo è un po 'accademico), ma potrebbe essere possibile farlo tramite un modello di fan-out con SNS come segue:

 1. Create a SNS topic.............................: SNS-topic-01
 2. Subscribe a SQS queue to that topic............: SQS-queue-01
 3. Subscribe a Lambda Function to that topic......: LAMBDA-func-01

Usando questa configurazione, l'invio di un messaggio all'argomento SNS lo accoderà alla coda SQS attivando contemporaneamente una funzione Lambda associata. Quella funzione Lambda verrebbe scritta per leggere la stessa coda SQS ma con Long Polling abilitato (fino a 20 secondi) in modo che non legga la coda prima del completamento della procedura di accodamento (es. Condizioni di gara).

In sostanza, questo schema just-in-time richiama una funzione Lambda per ogni messaggio SQS accodato. Non so come funzionano simultaneamente i lettori Long Poll su SQS (... uno viene eliminato?), Ma questo è solo un altro modo per considerare di risolverlo. = :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.