2012-04-07 11 views
3

Ich implementiere derzeit meine erste Webanwendung mit AWS-Infrastruktur und lerne die Grundlagen. Ich bin auf ein Designproblem gestoßen und habe das folgende Szenario zur Veranschaulichung meines Problems entwickelt:AWS Scalable Architecture Design

Angenommen, ich mache eine Webanwendung, die eine Website als PDF speichert und druckt und auf S3 speichert. Das Frontend hat eine einzige Form. Ein Benutzer würde eine URL für die Site eingeben, die er als PDF speichern möchte, und auf "Senden" klicken. Die App sollte die Seite unter der angegebenen URL auf pdf drucken und die Datei dem Benutzer präsentieren.

Um die App skalierbar zu machen, denke ich, dass das Klicken auf submit eine SQS-Nachricht an eine Warteschlange mit der zu verarbeitenden URL sendet. Eine Flotte von Arbeitern könnte dann aus dieser Warteschlange verbrauchen, erstellen Sie die PDFs &, speichern Sie sie in S3, und speichern Sie dann den S3 Schlüssel/Pfad zu SimpleDB. Das Problem, das ich habe, ist, wie ein Mitarbeiter dann die Web-App benachrichtigt, dass die Verarbeitung abgeschlossen ist?

Beispiel Entwurf: Example Design

ich die Web-App vorstellen konnte kontinuierlich Umfrage SimpleDB, bis ein Eintrag für den Schlüssel S3 erscheint jedoch diese Lösung ein bisschen ungeschickt scheint. Ich denke, das ist ein Muster/ein Problem, das allgemein angetroffen werden muss. Könnte jemand einen gemeinsamen Weg bieten, dies anzugehen?

Darüber hinaus wären alle empfohlenen Ressourcen für gängige Entwurfsmuster in der Cloud von großem Vorteil.

+2

+1 für die [einfachen AWS-Symbole] (http://aws.amazon.com/architecture/icons/) basierte Architekturdiagramm bereits, nett :) –

+0

Danke. Einen Link zu ihnen auf einem der AWS-Blogs gefunden. Definitiv nützlich! –

Antwort

1

Sofern Sie nicht so etwas wie WebSockets verwenden, sehe ich nicht, dass dies ein Problem ist. Wenn der Benutzer eine Anfrage stellt, fragt die Webanwendung SimpleDB ab (wie Sie bereits erwähnt haben), um zu prüfen, ob die Verarbeitung abgeschlossen wurde (oder ob ein Fehler aufgetreten ist). Mit etwas wie WebSockets könnten Sie dann eine andere Warteschlange haben, die die Webanwendung abonnieren würde, um benachrichtigt zu werden, wenn die Verarbeitung abgeschlossen ist, um dann den Browser darüber zu informieren, dass sie abgeschlossen ist.

+0

Danke für die Idee Greg. Ich bin nicht sicher, ob das Front-End-Abonnement für eine Warteschlange sinnvoll ist, da mehrere Web-App-Instanzen hinter dem ELB ausgeführt werden können. Es kann jedoch sinnvoll sein, sie alle für ein SNS-Thema zu abonnieren.Ich habe jedoch sehr wenig Erfahrung mit der Programmierung am Frontend und war mir nicht sicher, wie ich die Seite nach Erhalt einer SNS-Benachrichtigung aktualisieren würde. Jede Webanwendung müsste beim Empfang einer SNS-Nachricht eine Art Sitzungs-ID prüfen und überprüfen, ob sie sich auf eine Sitzung bezieht, die gerade auf dieser Maschine aktiv ist. Darüber hinaus bin ich ein wenig festgefahren: P –

+0

Ich nehme an, SimpleDB wiederholt zu pollen ist nicht _that_ bad, aber ich dachte, es könnte eine elegantere Lösung geben. –

+0

Sobald der Browser des Benutzers die Anforderung zum Starten der Verarbeitung sendet, geben Sie sofort eine Antwort zurück. Wenn Sie die Verbindung nicht für den Browser geöffnet halten, muss der Benutzer den Webserver abfragen, um zu überprüfen, ob die Verarbeitung abgeschlossen wurde. Eine Anfrage an SimpleDB ist ziemlich billig (verglichen mit dem, was Sie tun müssten, um die sofortige Aktualisierung der Seite mit WebSockets oder etwas Ähnlichem zu unterstützen). Sie können eine AJAX-Anforderung im Hintergrund verwenden, um nach dem Ergebnis zu suchen, und dann die Seite aktualisieren, wenn die Verarbeitung abgeschlossen ist. –

1

Wie Sie gesagt haben, haben Sie im Grunde alle Ihre Probleme gelöst, mit Ausnahme der Front-End, die unsere Back-End-API abfragen müsste, um zu sehen, ob das Medium bereit war. Bei meiner Firma machen wir das, was Sie oben gesagt haben, indem Sie Webseiten-Screenshots, aber auch JPG-Schnappschüsse von PDFs, Office-Dokumenten und Video-und Audio-Kodierung verarbeiten.

Wir verwenden Ajax für Updates und lassen sie so eingestellt werden, dass sie ein paar Mal pro Sekunde pingen und dann schrittweise auf eine Sekunde und alle paar Sekunden zurückfallen, um unsere Server nicht zu sehr zu belasten. Die andere Option, wie die andere Antwort erwähnt, würde WebSockets verwenden, die eine persistente Verbindung zum Server ist, von der Sie Daten "pushen" und "ziehen" können. Die meisten nutzen jedoch den Ajax-Polling-Ansatz. Mit alten Technologien wie Apache könnte dies eine große Sache für Tausende von Verbindungen sein, aber mit Dingen wie Nginx, Node und Zwischen-Caching ist es keine große Sache.

0

Sie können ein Objekt (z. B. eine Markierung) in S3 speichern und dann S3 statt einfacher DB abfragen. Auf diese Weise können Sie Stress vermeiden, und Ihre Polling-Leistung wird stabiler.

Sie können diesen Ansatz von Ihrer Web-App-Instanz abrufen oder sogar von der Ajax-Ebene abfragen. (Obwohl letzteres nicht die beste Wahl ist, da Fehler in diesen Aufrufen nicht auf Ihrem Server protokolliert werden)

Verwandte Themen