AWS SQS + SNS + Lambda

11

Ich habe mich gefragt, ob ich eine Nachricht an die SQS-Warteschlange senden und ein SNS-Thema abonnieren kann, um ein Lambda zum Senden einer E-Mail auszulösen.

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

Ich weiß, dass SNS-Nachrichten an SQS gesendet werden können, bin aber gespannt, ob der umgekehrte Weg möglich ist

Chida
quelle

Antworten:

11

Eine Sache, die ich getan habe, war, einen CloudWatch-Alarm on ApproximateNumberOfMessagesVisible( >= 1 for 5 minutes) für die SQS-Warteschlange zu erstellen . Der Alarm wird in einem SNS-Thema veröffentlicht, das die Lambda-Funktion auslöst. Die Lambda-Funktion wird so lange wiederholt, bis die Warteschlange gelöscht ist.

Das Auslösen des Alarms kann bis zu 5 Minuten dauern, funktioniert jedoch hervorragend für stapelweise geplante Aufgaben, ohne dass die Warteschlange abgefragt werden muss. (Die Alarmgranularität für aktive Warteschlangen beträgt 5 Minuten.)

Tintenfisch
quelle
Ich denke darüber nach, genau dasselbe zu tun. Wissen Sie, ob Sie jedes Mal belastet werden, wenn Cloudwatch Ihre Warteschlange überprüft? Nicht, dass wir mit so etwas wirklich viel mehr reden, nur neugieriger.
Brian F Leighty
Ich gehe auch davon aus, dass der Alarm immer wieder SNS des Alarms sendet. Auf was haben Sie das Timeout für Ihre Lambda-Funktion eingestellt?
Brian F Leighty
Eine andere Sache. Entschuldigung für alle Kommentare. Ich war ein wenig besorgt über den Teil "Ungefähr". Hatten Sie jemals eine Zeit, in der dort eine Nachricht wartete, die nicht behandelt wurde, da sie dachte, es gäbe nur 0 Artikel anstelle des 1 Artikels dort?
Brian F Leighty
@BrianFLeighty die Schecks sind kostenlos. Aber es alarmiert nicht ununterbrochen; Für Nachrichten in der Warteschlange ist möglicherweise ein zweiter Alarm erforderlich (zwischen Abschluss der Lambda-Ausführung und nächstem Alarm hinzugefügt). Polling kann eine bessere Lösung sein; meins arbeitet für eine normalerweise sehr ruhige Warteschlange (daher keine
Umfrage
Verpasste den "ungefähren" Kommentar. Das scheint gut zu funktionieren, aber ymmv
squidpickles
7

Sie können nicht gehen SQS -> SNS, nur SNS -> SQS.

Lambda unterstützt jetzt die Zeitplanung. Eine Möglichkeit besteht darin, einen SQS-Poller in einer Lambda-Funktion zu implementieren und häufig auszuführen.

Eine weitere Option ist, ob Sie tatsächlich eine Warteschlange benötigen. Lambda unterstützt die asynchrone Verarbeitung (über den Ereignisaufrufmodus) und sollte horizontal transparent skaliert werden, um parallele Aufrufe zu verarbeiten. Wenn Ihre Lambda-Funktion keinen Zugriff auf einen zentralen Statusspeicher erfordert, der die parallele Ausführung möglicherweise einschränkt, können Sie wahrscheinlich alle Ihre Aufrufe parallel ausführen. Ich glaube, es gibt ein Limit von 100 gleichzeitiger Ausführung pro Konto, daher müssen Sie möglicherweise Ihre Nachrichten stapeln, um darunter zu bleiben.

thexacre
quelle
3
Es ist auch nichts Falsches daran, herkömmliche Queue Poller-Tricks mit Lambda zu verwenden: Wenn Lambda beispielsweise während der Ausführung eine Nachricht aus der Warteschlange entfernt, wird die Funktion am Ende erneut ausgelöst. Andernfalls lassen Sie es als nächstes wie geplant ausführen
nik.shornikov
1

SQSDie Warteschlange kann zum SNSThema abonniert werden, um empfangene SNSNachrichten zu verarbeiten . Derzeit ist es ohne zusätzliche Codierung nicht in eine andere Richtung möglich (siehe z . B. LambdaFAQ ).

Ich würde sagen, es gibt einige Möglichkeiten, wie es geht, aber es ist nicht so elegant wie die Verwendung eines allgemeineren ereignisgesteuerten Systems AWS event->SQS->Lambda. Andernfalls müssen Sie möglicherweise den Code für SQSdie Verarbeitung von Warteschlangen anpassen / implementieren :

  1. Sie können Ihre eigenen Ereignisquellen implementieren
  2. Sie können eine EC2-Zwischeninstanz haben , um SQSWarteschlangen abzuhören und dann Lambdabei SQS-Ereignissen auszulösen
dsmsk80
quelle
0

Dies wurde vor einiger Zeit gefragt und beantwortet, aber nachdem ich selbst darüber nachgedacht hatte, dachte ich, ich würde einen Ansatz hinzufügen.

Wie bereits erwähnt, sind Ereignisquellen hier möglicherweise die beste Wahl. Alternativ, und ich habe dies weder getestet noch durchdacht (das ist also eine Art akademisch), aber es kann möglich sein, dies über ein Fan-Out-Muster mit SNS wie folgt zu erreichen:

 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

Wenn Sie diese Konfiguration verwenden und eine Nachricht an das SNS-Thema senden, wird sie in die SQS-Warteschlange eingereiht und gleichzeitig eine begleitende Lambda-Funktion ausgelöst. Diese Lambda-Funktion wird geschrieben, um dieselbe SQS-Warteschlange zu lesen, jedoch mit aktiviertem Long Polling (bis zu 20 Sekunden), damit die Warteschlange nicht gelesen wird, bevor die Warteschlange abgeschlossen ist (dh Race-Bedingung).

Im Wesentlichen ruft dieses Just-in-Time-Schema eine Lambda-Funktion für jede in die Warteschlange gestellte SQS-Nachricht auf. Ich weiß nicht, wie simultane Long Poll-Leser an SQS arbeiten (... wird man fallen gelassen?), Aber dies ist nur eine andere Möglichkeit, dies zu lösen. = :)

NYCeyes
quelle