Risposte:
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.)
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.
SQS
la coda può essere iscritta SNS
all'argomento e quindi per elaborare i SNS
messaggi ricevuti . Attualmente, non è possibile farlo in un'altra direzione senza codifica aggiuntiva (vedere ad es. Lambda
FAQ ).
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 SQS
vengono elaborate le code:
SQS
code e poi eseguire il trigger Lambda
su eventi SQSQuesto è 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. = :)