Top

RabbitMQ

Exchange, Queue und Binding - User - Plugins

Ein Message Broker der das Advanced Message Queuing Protokoll nutzt.
Zusätzlich werden noch weitere Protokolle wie STOMP oder MQTT unterstützt.
RabbitMQ ist in Erlang geschrieben und steht seit 2007 unter MPL zur Verfügung.

Den Server starten und stoppen.

rabbitmq-server start
rabbitmq-server stop

RabbitMQ kann als einzelne Instanz oder im Cluster betrieben werden.
Die Frage beantworten sich durch den Bedarf an Verfuugbarkeit oder Performance.

Der Standard Port ist 5672 das Management Web Interface ist unter Port 15672 zu erreichen aber nur wenn das rabbitmq_management Plugin aktiviert ist.
Das Management Plugin stellt zusätzlich eine HTTP API zur Verfügung.

Das Kommandozeilen Tool zum managen vom RabbitMQ Broker heißt rabbitmqctl.

Sich den Status des Brokers anzeigen lassen.

rabbitmqctl status

Sich die Benutzer des Brokers anzeigen lassen.

rabbitmqctl list_users

rabbitmqctl bietet noch sehr viel mehr Funktionalität.

Exchange, Queue und Binding

Beim Messaging gibt es immer Sender und Empfänger die Nachrichten austauschen.
Der Sender sendet seine Message an den Exchange, das Binding leitet dann die Message in eine oder mehrere Queues, von dort holt der Empfänger die Message ab. Es gibt unterschiedliche Typen eines Exchange mit abweichendem Verhalten.

Ein Exchange hat einen der folgenden Typen: direct, fanout, topic und headers.
direct ist der Standardwert und sendet basierend auf dem routing key zur Queue.
fanout sendet alle Messages zu allen bekannten Queues.
topic sendet Messages basierend auf dem routing key an die entsprechenden Queues.
headers sendet Messages basierend auf den Header und ignoriert den routing key.

Sich Queues, Exchanges oder Bindings anzeigen lassen.

rabbitmqctl list_exchanges
rabbitmqctl list_queues    
rabbitmqctl list_bindings

Diese Information kann man auch über die API bekommen.

http://127.0.0.1:15672/api/exchanges
http://127.0.0.1:15672/api/queues
http://127.0.0.1:15672/api/bindings

Dead Letter Exchanges

Wird eine Nachricht vom Empfänger abgelehnt wird diese als ‚dead-lettered‘ bezeichnet.
Nachrichten können zudem eine Lebenszeit haben, die man mit x-message-ttl in Millisekunden angibt.
Eine Queue kann mit x-max-length eine maximale Anzahl von Nachrichten oder mit x-max-length-bytes eine maximale Größe besitzen.
Um die ‚dead-lettered‘ Nachrichten nicht zu verlieren kann man mit x-dead-letter-exchange einen Exchange definieren an den die Nachrichten gesendet werden. Es gibt zudem die Möglichkeit mit x-dead-letter-routing-key den Routing Key der Nachricht zu ersetzen.
Die Header einer ‚dead-lettered‘ Nachricht werden verändert, der Exchange Name wird mit dem Dead Letter Exchange Namen ersetzt. Wird der Routing Key ersetzt werden die Header CC und BCC entfernt. Zudem wird eine Liste mit den Namen x-death hinzugefügt mit zusätzlichen Informationen.

Virtual Hosts

RabbitMQ unterstützt zusätzlich noch die Möglichkeit mit /vhosts eine logische Trennung zu realisieren.
Jeder Host ist wie ein eigener Server mit Queues, Exchanges, Bindings und Berechtigungen.

rabbitmqctl list_vhosts
rabbitmqctl add_vhost <vhost_name>
rabbitmqctl delete_vhost <vhost_name>

Auch hier bietet die API entsprechende Resourcen an.

http://127.0.0.1:15672/api/vhosts
http://127.0.0.1:15672/api/vhosts/<vhost_name>

Messages

Jede AMQP Message hat Eigenschaften die als Meta Informationen getrennt vom Message Inhalt zur Verfügung stehen.
Der Content-Type ist zum Beispiel eine dieser Eigenschaften, der Routing Key und noch zusätzliche Header.
Man kann dies mit den X-Headern in HTTP vergleichen. Einige werden von RabbitMQ genutzt die anderen können vom Sender gesetzt und vom Empfänger verarbeitet werden.

User

User kann man über das User Interface des Management Plugins und rabbitmqctl verwalten.
Das Permission System ermöglicht es den Zugriff auf VHosts, Exchanges und Queues zu regeln.

rabbitmqctl list_users
rabbitmqctl add_user <username> <password>
rabbitmqctl change_password <username> <newpassword>
rabbitmqctl delete_user <username>

Auch hier bietet die API entsprechende Resourcen an.

http://127.0.0.1:15672/api/users
http://127.0.0.1:15672/api/users/<username>

Permissions

Seit der Version 1.6.0 steht ein Permission System in Form einer Access Control List (ACL) zur Verfügung.
Das System unterscheidet zwischen read, write und configure.
read erlaubt es Messages zu empfangen und die Leerung von Queues.
write erlaubt es Messages zu senden, ist auch zum erstellen von Bindings nötig.
configure erlaubt es Exchanges und Queues zu erstellen und löschen.

Der erste User bekommt vollen Zugriff auf den VHost. Der zweite User kann von allen Exchanges und Queues empfangen nur and Exchanges und Queues senden die mit logs- beginnen und keine Exchanges und Queues erstellen oder löschen.

rabbitmqctl set_permissions -p <vhost> <user> ".*" ".*" ".*"
rabbitmqctl set_permissions -p <vhost> <user> "" "logs-.*" ".*"

Auch hier bietet die API entsprechende Resourcen an.

http://127.0.0.1:15672/api/permissions
http://127.0.0.1:15672/api/permissions/<vhost>/<username>

Plugins

RabbitMQ bringt einige Plugins mit, die man sich einfach anzeigen lassen kann.

rabbitmq-plugins list

Die Plugins können nach Bedarf mit enable aktiviert werden.

rabbitmq-plugins enable rabbitmq_management
rabbitmq-plugins enable rabbitmq_shovel rabbitmq_federation rabbitmq_management

Natürlich kann man Plugins mit disable auch wieder deaktivieren.

rabbitmq-plugins disable rabbitmq_management

Management Plugin

Das Management Plugin stellt ein User Interface unter Port 15672 bereit.
Eine API mit Dokumentation wird unter /api zur Verfügung gestellt.
Das Kommandozeilen Tool rabbitmqadmin kann unter /cli heruntergeladen werden.

http://127.0.0.1:15672/
http://127.0.0.1:15672/api/
http://127.0.0.1:15672/cli/

Federation Plugin

Mit dem Federation Plugin ist es möglich Broker miteinander zu verbinden.
Dazu definert man einen Upstream und mit einer Policy setzt man den Upstream.
Damit kann man z.B. Exchanges auf Machine A haben und Machine B bekommt die gleichen erstellt.
Wenn Nachrichten an den Exchange von Machine B gesendet werden, werden sie auch an Machine A gesendet.

http://127.0.0.1:15672/api/federation-links

Wenn die vorhandenen Plugins nicht ausreichen, kann man selbst das passende Plugin entwickeln.

Seit der Version 3.6.0 können Plugins direkt entwickelt werden.
Möchte man mehrer Projekte betreiben wird das RabbitMQ Public Umbrella Projekt zur Verfügung gestellt.

RabbitMQ Cloud Service: CloudAMQP