Wie verwende ich AWS SQS / SNS als Push-Benachrichtigungswarteschlange für schwere Verarbeitungsaufgaben über PHP?

Ich habe einen einzelnen Server auf dem Rackspace, der eine einzelne PHP-Web-App hostet.

Die PHP-Web-App akzeptiert eine Formularübermittlung, die dann eine auf den Formularfeldeinträgen basierende Aufgabe ausführen muss.

Die Aufgabe (nennen wir sie die Aufgabe zum Generieren von Metadaten) benötigt ziemlich viel Verarbeitungszeit. Ich habe mich gefragt, wie ich zulassen kann, dass die Formularübermittlung direkt in der Datenbank gespeichert und dem Benutzer sofort die Erfolgsseite angezeigt wird, während die Aufgabe zum Generieren von Metadaten im Hintergrund ausgeführt wird.

Ich habe installiert"aws/aws-sdk-php": "~3.11" Verwenden von Composer in derselben Webanwendung.

Mein Plan sieht zunächst so aus:

code, der die Formularübermittlung behandelt

$result = $model->save($_POST);
// this code will send the information to either SQS or SNS
$awsClient->sendsMessage($_POST);
if ($result) {
  $this->redirect('success.html');
}

Ich habe über das @ gelesfanout Architektur von AWS angegeben.

Meine Probleme mit dem Fanout-Architektur-Beispiel (so wie ich es verstehe) sind:

der Server, der die Nachricht an SQS oder SNS sendet, ist auch derselbe Server, der die Aufgabe zum Generieren von Metadaten verarbeitet. In der Tat ist es die gleiche Web-App.SQS füllt den Warteschlangenteil aus (weil ich die Aufgaben in einem FIFO ausführen möchte und die Aufgaben sehr lange dauern). Meine Web-App muss SQS jedoch kontinuierlich abfragen. Ich möchte lieber eine Push-Benachrichtigung (von AWS an meine Web-App), als dass meine Web-App AWS fortlaufend auf auszuführende Aufgaben abfragt.

Ich habe eine mögliche Lösung gefunden.Hie

Die vorgeschlagene Lösung lautet:

enden Sie die Nachricht an ein SNS-Them

Das SNS-Thema meldet sowohl eine SQS-Warteschlange als auch meine Webanwendung.

Meine Web-App ruft nach dem Auslösen dieselbe SQS-Warteschlange ab, in der sich die Nachricht jetzt ununterbrochen in der Warteschlange befindet, bis die Warteschlange leer ist

Der Nachteil, den ich daraus sehe, ist, dass meine Web-App die Warteschlange abruft, bevor die Warteschlange selbst die Nachricht enthält.

Was ist der beste Weg, um Push-Warteschlangen mithilfe von AWS-Diensten zu implementieren?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage