Programmierung · Architektur · Backend
Was ist eine Message Queue?
Wenn ein Teil deiner App Arbeit an einen anderen übergeben muss - eine E-Mail senden, ein Bild skalieren, eine Karte belasten - lässt das inline den Nutzer warten und koppelt beide Teile eng. Eine Message Queue ist die Standardlösung: ein Puffer in der Mitte, in dem ein Dienst eine Aufgabe ablegt und ein anderer sie später abholt. Dieser Leitfaden erklärt, was eine Message Queue ist, wie Producer und Consumer sie nutzen und wann du wirklich eine brauchst.
Die Kernidee: Producer, Queue, Consumer
Eine Message Queue sitzt zwischen dem Code, der Arbeit erzeugt, und dem, der sie erledigt. Ein Producer legt eine Nachricht - eine kleine Dateneinheit, die eine Aufgabe beschreibt - in die Queue. Ein Consumer nimmt Nachrichten heraus und verarbeitet sie. Die Queue hält jede Nachricht, bis sie erledigt ist, meist in First-in-First-out-Reihenfolge. Entscheidend: Der Producer wartet nicht auf den Consumer und muss nicht einmal wissen, wer er ist.
Warum eine nutzen: Entkopplung, Puffer, Resilienz
Eine Queue bringt mehreres auf einmal. Sie entkoppelt Producer und Consumer, sodass du sie unabhängig bauen, deployen und skalieren kannst. Sie puffert Spitzen: kommen 10.000 Anmeldungen auf einmal, stellen sie sich an, statt den Worker zu überlasten. Sie schafft Resilienz, denn ist ein Consumer ausgefallen, warten die Nachrichten, statt verloren zu gehen. Und sie macht Arbeit asynchron - du gibst dem Nutzer sofort die Kontrolle zurück und erledigst den langsamen Teil im Hintergrund.
Queue vs Publish/Subscribe
Es gibt zwei gängige Muster. In einer einfachen Work Queue wird jede Nachricht an genau einen Consumer zugestellt - ideal, um Aufgaben auf einen Pool von Workern zu verteilen. Bei Publish/Subscribe (Pub/Sub) wird eine Nachricht an jeden interessierten Abonnenten gesendet - ideal für Ereignisse, auf die mehrere Teile des Systems reagieren. Viele Broker können beides, über die Idee von Exchanges oder Topics, die entscheiden, wer eine Kopie bekommt.
Zustellgarantien, ehrlich betrachtet
Queues beschreiben, wie sehr sie sich um die Zustellung bemühen: höchstens einmal (schnell, kann verlieren), mindestens einmal (kann zweimal zustellen) und genau einmal (am schwersten, in der Praxis oft eingeschränkt). Die meisten realen Systeme bieten mindestens-einmal, was heißt, dass deine Consumer idempotent sein sollten - dieselbe Nachricht zweimal zu verarbeiten darf keinen Schaden anrichten. Consumer bestätigen eine Nachricht meist erst nach der Verarbeitung; stürzt einer vor der Bestätigung ab, wird die Nachricht erneut zugestellt. Nachrichten, die immer wieder scheitern, landen zur Prüfung in einer Dead-Letter-Queue.
Gängige Broker: RabbitMQ, Kafka, Redis
Einige Werkzeuge dominieren. RabbitMQ ist ein klassischer Broker mit flexiblem Routing (spricht AMQP). Apache Kafka ist ein langlebiges, durchsatzstarkes Log: es behält Nachrichten, sodass Consumer einen Stream erneut abspielen können, was zu Ereignis-Pipelines und Analytik passt. Redis bietet leichte, sehr schnelle Queues und Streams, standardmäßig aber weniger dauerhaft. In der Cloud nehmen verwaltete Optionen wie AWS SQS und Google Pub/Sub die Betriebslast ab. Wähle nach Bedarf: RabbitMQ fürs Routing, Kafka für abspielbare Streams mit hohem Volumen, Redis fürs Einfache und Schnelle.
Wann du keine brauchst
Eine Queue ist ein bewegliches Teil, das du betreiben und überwachen musst. Ist die Arbeit schnell und braucht der Aufrufer das Ergebnis wirklich sofort, ist ein direkter Funktionsaufruf oder ein Schreibvorgang in eine Datenbank einfacher. Greife zu einer Message Queue, wenn du asynchrone Hintergrundjobs brauchst, Lastspitzen abfedern willst oder Dienste entkoppeln musst, die nicht direkt voneinander abhängen sollten - dieselben Gründe, aus denen du Dienste vielleicht schon hinter einen Reverse Proxy oder einen Load Balancer stellst.
Das Fazit
Eine Message Queue ist ein Puffer zwischen Diensten: Producer legen Arbeit ab, Consumer holen sie ab, und beide sind entkoppelt, während die Last geglättet wird. Nutze eine einfache Work Queue, um Aufgaben zu verteilen, Pub/Sub, um Ereignisse zu verbreiten, rechne mit mindestens-einmal-Zustellung (mach Consumer also idempotent), und greife zu RabbitMQ, Kafka, Redis oder einer verwalteten Cloud-Queue, wenn du zuverlässige asynchrone Verarbeitung brauchst.