Blog

Pub-Sub-Nachrichten mit AWS SNS und SQS

Léon Rodenburg

Léon Rodenburg

Aktualisiert Oktober 21, 2025
5 Minuten

Wenn Sie eine neue Anwendung oder Plattform einrichten, ist eines der wichtigsten Dinge, die Sie benötigen, das Messaging. Da jeder Teil der Plattform einen bestimmten Bedarf an Daten hat, entweder in Echtzeit oder im Nachhinein, müssen Nachrichten von anderen Diensten innerhalb der Anwendungsgrenze so effizient wie möglich verarbeitet werden. Dieses inter-executable Messaging kann von einfachen Benachrichtigungen über ein Ereignis in einer Domäne ('Kunde X hat seinen Namen in Y geändert') bis hin zu einer Warteschlange ausstehender Aufträge reichen, die von Workern ausgeführt werden sollen. In jedem architektonischen Fall, sei es ein (verteilter) Monolith, Mikrolithen, Microservices oder irgendetwas dazwischen, wird es Nachrichten geben.

Pub-Sub (publish-subscribe) Messaging ist eine asynchrone, entkoppelte Art der Nachrichtenübermittlung. Die Seite, von der die Nachricht ausgeht, hat keine Ahnung von den Empfängern, während die Empfänger nicht wissen, woher die Nachricht kommt. Pub-sub kann Ihnen helfen, eine widerstandsfähigere Anwendung zu erstellen, da Sie entweder die produzierende oder die abonnierende Seite ändern können, ohne dass dies Auswirkungen auf den Nachrichtenfluss hat. Sie können auch beide Seiten unabhängig voneinander skalieren. [caption id="" align="alignnone" width="694"]AWS pub-sub-messaging Pub-Sub-Messaging. Bild von der AWS-Website(AWS pub-sub-messaging) [/caption]

Der AWS-Messaging-Bonbonladen

Da unsere Plattform auf AWS betrieben wird, haben wir versucht, immer mehr der Services zu nutzen, die Sie (fast) kostenlos erhalten. Einer davon ist Kinesis, das als serviceübergreifender Nachrichtenbus dient, in dem Nachrichten veröffentlicht und von allen interessierten Parteien konsumiert werden können. Die Verwendung von Kinesis ersparte uns den Betrieb und die Verwaltung eines eigenen Kafka-Clusters und zwang uns nicht, eine bestimmte Sprache oder ein bestimmtes Framework zu wählen, wie es bei anderen der Fall ist. Wir waren ohnehin bei AWS, so dass wir uns bereits eingekauft hatten. Nach einer Weile zeigte sich jedoch, dass einige der Eigenschaften fehlten, die wir für unsere Anwendungen benötigten. Am ärgerlichsten ist, dass es schwer ist, eine einzelne Nachricht zu debuggen oder wiederzugeben. In Kinesis können Sie Nachrichten wiedergeben, indem Sie den Tracker auf eine bestimmte Nachrichten-ID setzen. Damit ist die Aufgabe zwar erledigt, aber es werden auch alle Nachrichten wiedergegeben, die nach der Nachricht, die Sie wiedergeben wollten, gesendet wurden. Natürlich sollte die Anwendung in der Lage sein, alle Nachrichten zu deduplizieren, aber manchmal kann es schwierig oder kostspielig sein, die Anwendung völlig unempfindlich gegen doppelte Zustellung zu machen. Also haben wir uns nach Alternativen umgesehen. In den letzten Wochen hatten wir Amazons Simple Queue Service (SQS) verwendet, um einige der asynchronen 1-zu-1-Kommunikation zwischen verschiedenen Diensten zu steuern. Im Gegensatz zu den Streams von Kinesis oder Kafka, bei denen die Nachrichten gesplittet werden, ist eine Warteschlange eine einfachere Abstraktion, die einen natürlichen 'Posteingang' für einen Dienst bilden kann. Besonders für Nachrichten mit niedriger Priorität oder Prozesse, bei denen der Benutzer nicht auf eine Antwort wartet, ist die Warteschlange am besten geeignet. Die Verwendung von SQS-Warteschlangen ermöglicht die Konfiguration einer Dead-Letter-Warteschlange, in der die Nachrichten landen, wenn sie aus irgendeinem Grund nicht konsumiert werden konnten. Das ist der Haken, den Sie verwenden können, um Nachrichten zu debuggen und nur die fehlgeschlagenen Konsumenten wiederzugeben. Der Nachteil von einfachen Warteschlangen ist, dass die Erzeuger von Nachrichten wissen müssen, wohin sie diese weiterleiten sollen, so dass Sie viele der bereits erwähnten Vorteile der Entkopplung verlieren. Hier kommt der AWS Simple Notification Service (SNS), unser Held des Tages. Wie der Name schon sagt, wird er zum Versenden von Benachrichtigungen verwendet. Was der Name auf den ersten Blick nicht vermuten lässt, ist, dass diese Benachrichtigungen auch Nachrichten in SQS-Warteschlangen sein können. Erkennen Sie das Muster, das sich abzeichnet? Entkoppelte Nachrichtenübermittlung über SNS-Themen, die mit den Posteingängen der Dienste verknüpft sind, die diese speziellen Nachrichten benötigen! Es fühlt sich an wie das Beste aus beiden Welten.

SNS + SQS = 🚀

Also gut, versuchen wir es einzurichten. Ich habe ein Repository(hier verfügbar) mit den CloudFormation-Vorlagen erstellt, um ein SNS-Thema einzurichten, das mit einer oder mehreren SQS-Warteschlangen verbunden ist, die ebenfalls erstellt werden. Diese Verbindung wird als Abonnement bezeichnet. Um den Stack etwas überschaubarer zu machen und weil CloudFormation die Schleifenbildung nicht nativ unterstützt, habe ich die Jinja2-Vorlagen von Sceptre in der Datei templates/sns-pubsub.j2 verwendet. Sie brauchen dort keine Änderungen vorzunehmen. Wenn Sie nicht in eu-west-1 bereitstellen möchten, müssen Sie config/messaging/config.yaml entsprechend ändern. Werfen wir auch einen Blick auf config/messaging/sns-pubsub.yaml:

Wenn Sie mit der Bearbeitung fertig sind, können Sie den Stack in AWS bereitstellen (dies setzt voraus, dass Sie Sceptre installiert haben und über gültige Anmeldedaten verfügen):

Dadurch werden das SNS-Thema und die SQS-Warteschlangen erstellt. Außerdem wird eine Warteschlangenrichtlinie eingerichtet, damit das SNS-Thema die Rechte erhält, Nachrichten an die Warteschlangen zu senden. Wenn Sie zu einem späteren Zeitpunkt mehr oder weniger Warteschlangen benötigen, können Sie diese einfach zum Array hinzufügen oder daraus löschen und mit demselben Befehl den Stack aktualisieren. Lassen Sie uns eine Nachricht an das SNS-Thema senden:

Ersetzen Sie YOUR_ARN_HERE durch den ARN des erstellten Themas. Sie finden ihn im SNS-Service in der AWS-Verwaltungskonsole. Wenn dies erfolgreich war, sollte eine einfache JSON-Antwort mit einer Nachrichten-ID zurückgegeben werden. Wenn Sie sich jetzt bei der AWS-Verwaltungskonsole anmelden und zu SQS gehen, sollten Sie die von Ihnen erstellten Warteschlangen sehen und dass in jeder Warteschlange eine Nachricht verfügbar ist. Wenn Sie auf eine Warteschlange klicken, können Sie unter Warteschlangen-Aktionen die Option Nachrichten anzeigen/löschen auswählen. Klicken Sie auf das blaue Feld Abruf für Nachrichten starten und Ihre Nachricht sollte erscheinen. Meine Nutzlast war wie folgt:

Fantastisch! Ein letzter Hinweis: Wenn Sie dies in der Praxis anwenden möchten, stellen Sie sicher, dass die produzierende Seite über die richtigen Rollen oder Berechtigungen verfügt, um Benachrichtigungen zu dem Thema zu senden. Vergewissern Sie sich auch, dass die konsumierende Seite über die Berechtigung verfügt, aus der Warteschlange zu lesen.

Verfasst von

Léon Rodenburg

Léon Rodenburg is a full stack development consultant at Xebia. He has a background in Computer Science and Sinology and is always on the lookout for the crossroads between the two. Having lived and studied in China for quite some time, he has put his knowledge of the Chinese language into practice by experiencing on- and offline daily life in Beijing like a local.

Contact

Let’s discuss how we can support your journey.