Lesen SQS-Warteschlange von AWS Lambda
Ich habe folgende Infrastruktur:
Ich habe eine EC2-Instanz mit einem NodeJS+Express Prozess lauscht auf einen port für die Nachrichten (Prozess 1). Jedes mal, wenn der Prozess eine Nachricht empfängt, sendet es eine SQS-Warteschlange. Dann habe ich einen anderen Prozess auf der gleichen Maschine Lesen der queue mit long polling (Prozess 2). Wenn es findet eine Nachricht in der Warteschlange es fügt die Daten in eine MariaDB-Datenbank sitzt auf einem RDS-instance.
(Nur um zu klären, Nachrichten werden von den Benutzern generiert werden, senden Sie eine Menge Daten enthalten kann beliebige Informationen zu dem Endpunkt, wo der Prozess 1 hört)
Nun will ich den Prozess, der liest die SQS (Prozess 2) in eine Lambda-Funktion, so dass der Prozess, der schreibt an die Warteschlange und die eine, die liest aus der queue sind vollständig unabhängig voneinander. Das problem ist, dass ich don T wissen, ob dies möglich ist.
Weiß ich, dass die Lambda-Funktion aufgerufen werden, in Reaktion auf ein Ereignis und die Ereignisse, die zur Zeit unterstützt werden S3, SNS, SES, DynamoDB, Kinesis, Cognito, CloudWatch und Cloudformation aber NICHT-SQS -.
Ich dachte mit SNS-Benachrichtigungen zum anrufen der Lambda-Funktion, so dass jedes mal eine Nachricht gedrückt, um den queue, eine SNS-Benachrichtigung ausgelöst und ruft die Lambda-Funktion aber nach dem spielen ein bisschen mit ihm habe ich gemerkt, dass ist nicht möglich, erstellen Sie eine SNS-Benachrichtigung von SQS, ist es nur möglich zu schreiben SNS-Benachrichtigungen in der Warteschlange.
Momentan bin ich ein wenig stecken, weil ich nicht weiß, wie es weiter geht. Ich habe das Gefühl, dass ist leider nicht möglich, diese Infrastruktur aufgrund der aktuellen Einschränkungen in der AWS-services. Gibt es einen anderen Weg das zu tun, was ich will oder bin ich in einer Sackgasse?
Nur zu erweitern, meine Frage mit einigen der Forschung, die ich gemacht habe, dieses github-repo zeigt, wie zu Lesen, eine SQS-queu von einer Lambda-Funktion aber die lambda-Funktion funktioniert nur, wenn gefeuert wird von der Befehlszeile aus:
https://github.com/robinjmurphy/sqs-to-lambda
In der readme, der Autor erwähnt die folgenden:
Update: Lambda-unterstützt jetzt SNS-Benachrichtigungen, wie eine Quelle,
was macht dieser hack völlig unnötig für SNS-notifcations. Sie
könnte noch nützlich finden, wenn Sie wie die Idee der Verwendung von Lambda
Funktion zur Verarbeitung von Aufträgen, die auf einer SQS-Warteschlange.
Aber ich denke, dass dies nicht mein problem lösen, eine SNS-Benachrichtigung aufrufen kann die Lambda-Funktion aber ich sehe nicht, wie kann ich eine Meldung erstellen, wenn eine Nachricht empfangen wird, in der SQS queue.
Dank
Ich denke, dass hier ist, wo ich anfangen verwirrt zu werden. Ich will nicht schreiben, SNS-Nachrichten in eine Warteschlange. Die Nachrichten in der Warteschlange werden von den Benutzern generiert (Sie post-Daten an eine URL, meine nodejs-thread, der die Anforderung verarbeitet, formatiert die Daten und sendet Sie an der SQS-Warteschlange). Dann, was ich tun möchte, jedes mal eine Benutzer-Nachricht eingefügt wird in die queue, trigger irgendwie eine SNS-Benachrichtigung aufrufen, der Lambda-Funktion (die in der Tat, gemacht, indem die Lambda-Funktion hören SNS)
Anstelle der Verbindung der Punkte zwischen Lambda, SQS & SNS. Ich möchte empfehlen, unter Berücksichtigung der Terminierung des lambda-Funktion zu betrachten, die Warteschlange zu verarbeiten die Artikel, wenn Sie existiert. Die andere Variante ist mit 2 Lambda-Funktionen - One ziehen das Lesen der Elemente von SQS[geplant], und drücken Sie die Elemente, um die SNS, die dann behandelt werden, indem eine weitere Verarbeitung Lambda-Funktion.
Das macht Sinn. In der Tat ist diese Lösung ähnlich wie das system, das wir derzeit haben, mit cronjobs und die Prüfung der Warteschlange alle paar Minuten oder Sekunden. Ich dachte auch in die Verwendung von CloudWatch um die Warteschlange zu überprüfen Statistiken und auslösen der lambda-Funktion, wenn es irgendwelche Meldungen gibt. Danke für die Anregung. Ich werde das weiter untersuchen.
froh, dass es geholfen hat. Ich Schreibe das als Antwort.
InformationsquelleAutor mIwE | 2016-01-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es einige Strategien, die verwendet werden kann, die Punkte zu verbinden, (A)Synchron oder Laufen-Schlafen-Laufen, um zu halten die Daten, die Prozess-flow zwischen SNS, SQS, Lambda.
Strategie 1 : eine Lambda-Funktion hören Sie auf SNS und verarbeiten Sie in Echtzeit [Bitte beachten Sie, dass eine SQS-Warteschlange abonnieren kann ein SNS-Thema -, das
kann hilfreich sein für die Protokollierung /überwachung /retry-handling]Strategie 2 : Angesichts der Tatsache, dass Sie immer die Daten bezogen auf die SQS-Queue. Sie können versuchen, mit 2 Lambda-Funktionen [Feeder & Arbeiter].
Gutes Beispiel für die Strategie 2 kann hier gefunden werden: cloudonaut.io/...
InformationsquelleAutor Naveen Vijay
Können wir nun verwenden, SQS-Nachrichten auslösen AWS Lambda-Funktionen. Darüber hinaus ist nicht mehr erforderlich, führen Sie eine Nachricht polling-service oder erstellen Sie eine SQS, SNS-mapping.
Weitere details:
https://aws.amazon.com/blogs/aws/aws-lambda-adds-amazon-simple-queue-service-to-supported-event-sources/
InformationsquelleAutor Chamin Wickramarathna
Ich hatte eine ähnliche situation (und haben jetzt eine funktionierende Lösung deploed). Ich habe es angesprochen: in einer der folgenden Art und Weise:
d.h. publishing-Veranstaltungen zu sozialen Netzwerken; die dann bekommen geschürt-out, Lambda und SQS.
HINWEIS: Dies ist nicht zutreffend für die Ereignisse, die verarbeitet werden müssen in einer bestimmten Reihenfolge.
Dass es einige Fallstricke (w/mögliche Lösungen), wie:
Die Lösung für beide Fälle wäre long-polling der SQS-Warteschlange, aber dies macht deine lambda-Rechnung teurer.
note1
InformationsquelleAutor Neil
AWS SQS ist eines der ältesten Produkte von Amazon, die nur unterstützt polling (langen und kurzen) bis Juni 2018. Wie bereits in diese Antwort, AWS SQS unterstützt nun die Funktion der Auslösung von lambda-Funktionen auf neue Nachricht Ankunft in SQS. Ein komplettes tutorial für diese ist in dieses Dokument.
Ich verwendet, um zu lösen dieses problem durch verschiedene Mechanismen, und da unten sind einige Ansätze, die Sie verwenden können.
Können Sie entwickeln eine einfache polling-Anwendung in Lambda, und verwenden Sie AWS CloudWatch aufgerufen werden alle 5 Minuten oder so. Sie können diese in nahezu Echtzeit durch die Verwendung von CloudWatch-Ereignisse aufrufen lambda mit kurzen Stillstandszeiten. Verwenden dieses tutorial oder dieses tutorial für diesen Zweck. (Dies könnte mehr Kosten auf Lambdas)
Können Sie prüfen, die SQS ist zu entlassen, wenn Sie nicht brauchen, um bestehen die Nachrichten, die noch Garantie für die Reihenfolge der Lieferung. Sie können AWS SNS (Simple Notification Service) direkt aufrufen einer lambda-Funktion und tun, was für die Verarbeitung benötigt. Verwenden dieses tutorial für diesen Zweck. Dies geschieht in Echtzeit. Aber der größte Nachteil ist die Anzahl der lambdas, kann eingeleitet werden pro region zu einer bestimmten Zeit. Bitte Lesen Sie diese und zu verstehen, die Einschränkung vor, folgt diesem Ansatz. Dennoch AWS SNS Garantiert die Reihenfolge der Lieferung. Auch SNS können direkt rufen Sie einen HTTP-Endpunkt und speichern Sie die Nachricht in Ihrem DB.
InformationsquelleAutor Keet Sugathadasa
Hatten wir einige ähnliche Anforderungen, so dass wir am Ende den Aufbau einer Bibliothek und open sourcing es zu helfen, mit SQS-Lambda async. Ich bin mir nicht sicher, ob dies füllt Ihren bestimmten Satz von Anforderungen, dachte aber, es könnte einen Blick Wert sein: https://read.iopipe.com/sqs-lambda-teaming-up-92c4096be49c
Sicher, im Grunde haben wir als open Source Projekt auf Github zu finden hier: github.com/iopipe/sqs-to-lambda-async Dies ermöglicht das auslösen einer Lambda-Funktion über SQS asynchron.
InformationsquelleAutor adjohn