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