In der IT müssen ständig Nach­rich­ten von einem Dienst zum anderen geleitet werden. Das muss auf eine kon­trol­lier­te Weise geschehen, sonst blo­ckie­ren sich Nach­rich­ten ge­gen­sei­tig, es entsteht ein Stau und Prozesse können nicht optimal ablaufen. Damit An­wen­dun­gen pro­blem­los mit­ein­an­der kom­mu­ni­zie­ren, ist es sinnvoll, einen Mit­tels­mann ein­zu­schal­ten – einen Dienst, der die Ver­tei­lung der Nach­rich­ten übernimmt. Diesen nennt man Messaging Broker. Einen der be­kann­tes­ten stellen wir hier vor: RabbitMQ.

KI-Assistent kostenlos – Ihr smarter All­tags­hel­fer
  • DSGVO-konform & sicher gehostet in Deutsch­land
  • Pro­duk­ti­vi­tät steigern – weniger Aufwand, mehr Output
  • Direkt im Browser starten – ohne In­stal­la­ti­on

Was ist RabbitMQ?

RabbitMQ basiert auf der Idee des Advanced Message Queuing Protocols (AMQP). Der große Vorteil von AMQP: Sender und Empfänger müssen nicht die gleiche Pro­gram­mier­spra­che verstehen. In­zwi­schen hat sich der Messaging Broker etwas von AMQP gelöst und geht dank Plug-ins auch mit anderen Nach­rich­ten­pro­to­kol­len wie STOMP oder MQTT um – die Idee bleibt aber die gleiche: Zwischen dem Pro­du­zen­ten und dem Kon­su­men­ten einer Nachricht liegt eine War­te­schlan­ge. In dieser werden die Messages zwi­schen­ge­la­gert.

Fakt

Der Begriff „Nachricht“ wird in diesem Kontext sehr offen verwendet. Nach­rich­ten können An­wei­sun­gen an andere Programme oder tat­säch­li­che Text­nach­rich­ten sein. Jegliche Form der In­for­ma­ti­ons­ver­mitt­lung kann über RabbitMQ oder andere Messaging Broker statt­fin­den.

Der Vorteil von RabbitMQ liegt darin, dass der Produzent der Nachricht den Versand nicht selbst über­neh­men muss. Der Messaging Broker nimmt die Nachricht ab und gibt dem Pro­du­zen­ten so die Mög­lich­keit, eine neue Aufgabe zu beginnen. Der Sender muss nicht warten, bis der Empfänger die Nachricht empfangen hat. Die Nachricht sitzt bei diesem Verfahren in der War­te­schlan­ge und kann dann vom Kon­su­men­ten abgeholt werden. Der Sender ist zu diesem Zeitpunkt schon mit einer neuen Aufgabe be­schäf­tigt. Es handelt sich also um ein asyn­chro­nes Verfahren: Sender und Empfänger müssen nicht im gleichen Rhythmus agieren.

Ablauf mit RabbitMQ

Bei der Nach­rich­ten­über­mitt­lung gibt es vier Stationen:

  • Producer: erzeugt Nach­rich­ten
  • Exchange: leitet Nach­rich­ten weiter
  • Queue: lagert Nach­rich­ten
  • Consumer: ver­ar­bei­tet die Nachricht

Der Producer ver­öf­fent­licht eine Nachricht, sendet diese aber nicht direkt an den Consumer, sondern übergibt sie an die Exchange. Diese Position ist dafür ver­ant­wort­lich, die Nach­rich­ten auf ver­schie­de­ne War­te­schlan­gen zu verteilen. Aus denen bedienen sich Consumer mit Nach­rich­ten. Sowohl die Exchange als auch die Queues sind Teil von RabbitMQ und werden von der Software verwaltet. Damit Nach­rich­ten den richtigen Adres­sa­ten erreichen, verwendet man Routing Keys. Der Sender gibt der Nachricht einen Routing Key mit, der wie eine Adresse funk­tio­niert. Die Exchange erkennt anhand des Schlüs­sels, wie die Nachricht geroutet werden muss.

Zwischen Exchange und Queue besteht ein so­ge­nann­tes Binding. Über dieses ist jede einzelne War­te­schlan­ge mit dem Exchange verbunden. Das Binding definiert zudem, nach welchen Kriterien eine Nachricht wei­ter­ge­lei­tet werden soll. Es gibt vier ver­schie­de­ne Grund­ar­ten, wie Nach­rich­ten verteilt werden können.

Direct Exchange

Eine Direct Exchange ist eine direkte Ver­bin­dung zwischen Sender und Empfänger. Der Producer stattet die Nachricht mit einem Routing Key aus, der einem ent­spre­chen­den Binding Key der Queue ent­spricht. Das bedeutet, dass auch nur eine Queue in Frage kommt, an der wiederum in der Regel nur ein Consumer hängt.

Topic Exchange

Dieser Exchange-Typ erweitert das Konzept der Direct Exchange. Statt nur eines Kri­te­ri­ums (Routing Key = Binding Key) können mehrere Queues an­ge­spro­chen werden. Dies funk­tio­niert über Platz­hal­ter. So können bestimmte Queues bzw. Binding Keys ak­zep­tiert werden, andere bleiben aber aus­ge­schlos­sen.

Fanout Exchange

Die Fanout Exchange ist ein Broadcast. Man verteilt dabei eine Nachricht an alle ver­füg­ba­ren Queues. Es findet keine Sor­tie­rung statt. Ein Routing Key wird ignoriert.

Header Exchange

Auch bei Header Exchanges ignoriert das System einen Routing Key. Statt­des­sen spielt der Header der Nachricht eine wichtige Rolle. In diesem findet die Exchange die Attribute, um die korrekten Queues an­zu­steu­ern. Insofern funk­tio­niert eine Header Exchange analog zu Topic Exchanges, da auch in diesem Fall mehrere Queues, aber nicht alle an­ge­spro­chen werden können.

Consumer, also die emp­fan­gen­de Software, re­gis­trie­ren sich auf bestimmte Queues und beziehen von diesen die Nach­rich­ten. Deshalb ist auch pro Queue nur ein Consumer vor­ge­se­hen. Sollten mehrere Consumer Nach­rich­ten aus einer War­te­schlan­ge ziehen, kann die korrekte Ver­tei­lung nicht ga­ran­tiert werden. Optional ent­schei­det man für jede Nachricht, ob der Empfänger den Erhalt quit­tie­ren muss oder ob dies nicht notwendig ist.

RabbitMQ im Einsatz

RabbitMQ ist ein Open-Source-Server, in der Pro­gram­mier­spra­che Erlang ge­schrie­ben und kann für Linux, BSD, Unix, Windows und macOS von der of­fi­zi­el­len Website her­un­ter­ge­la­den werden. Zu­sätz­lich sind Plug-ins emp­feh­lens­wert, die die Arbeit mit dem Messaging Broker er­leich­tern und den Funk­ti­ons­um­fang erweitern. An erster Stelle dürfte hier das Ma­nage­ment-Plug-in stehen, das Teil der Stan­dard­in­stal­la­ti­on ist, aber aktiviert werden muss. Damit können Nutzer RabbitMQ über ein GUI verwalten, haben den Überblick über Nach­rich­ten in War­te­schlei­fen und können Sta­tis­ti­ken einsehen.

Wichtig kann zudem das Plug-in Shovel sein: Hiermit ist es möglich, zwei Broker-Instanzen mit­ein­an­der zu verbinden. Dies ist sinnvoll, um bei­spiels­wei­se die Last besser zu verteilen. Außerdem ver­schiebt man so sensible oder sehr um­fang­rei­che Da­ten­men­gen, etwa aus Si­cher­heits­grün­den, in ein komplett anderes Netzwerk.

Die Kom­mu­ni­ka­ti­on funk­tio­niert über TCP, weshalb RabbitMQ Ports benötigt. Diese dürfen nicht ge­schlos­sen oder durch andere An­wen­dun­gen blockiert werden. Eine Liste aller ver­wen­de­ten Ports findet man in der Do­ku­men­ta­ti­on von RabbitMQ.

Fazit

RabbitMQ überzeugt vor allem durch seine schlanke Kon­struk­ti­on. Der Messaging Broker lässt sich schnell aufbauen und ist in vielen Si­tua­tio­nen nützlich. In größeren Szenarien greifen Ent­wick­ler und Admins al­ler­dings lieber zu Apache Kafka.

Zum Hauptmenü