Passer d’ActiveMQ à RabbitMQ

J’utilise actuellement ActiveMQ pour mes besoins de messagerie; à part quelques échecs de db, cela a bien fonctionné. Cependant, je pense au moins à essayer RabbitMQ. Mais avant moi, j’aimerais comprendre ce qui suit:

  1. En quoi RabbitMQ diffère-t-il d’ActiveMQ? Qu’est-ce que RabbitMQ fait de mieux ou de pire qu’ActiveMQ?
  2. En comparaison, comment configurer facilement et facilement RabbitMQ?
  3. Dans quelle mesure RabbitMQ est-il intégré à Spring?
    • Avec ActiveMQ, je JmsTemplate simplement un bean de fabrique de connexions dans un JmsTemplate et DefaultMessageListener beans DefaultMessageListener pour connecter les files d’attente à leurs gestionnaires respectifs. Puis-je essentiellement faire la même chose avec RabbitMQ?

  1. RabbitMQ est un broker AMQP, alors qu’ActiveMQ est un broker JMS. Je vous suggère de lire l’article de Wikipédia AMQP pour avoir une idée des concepts utilisés dans AMQP, qui sont différents de ceux que vous connaissez dans JMS. L’une des principales différences réside dans le fait que dans un AMQP, un producteur envoie à un échange sans connaître la stratégie de dissortingbution du message, alors que dans JMS, le producteur cible une queue ou un sujet (connaissant le type de routage de message). Il est donc difficile de dire ce qui se passe mieux ou moins bien, car la sémantique est très différente entre JMS et AMQP.

  2. Les files d’attente et les échanges de RabbitMQ sont tous configurés via le protocole AMQP afin qu’une bibliothèque client vous permette de configurer toutes vos destinations et leur comportement. ActiveMQ nécessite une configuration de destination spécifique car la spécification JMS ne couvre aucune des faces d’administration. De plus, la configuration du système de RabbitMQ est Erlang-esque, alors qu’ActiveMQ est généralement configuré en XML. Vous devrez donc vous habituer à la {tuple} et à la <> belle syntaxe. RabbitMQ est généralement installé avec les packages du système d’exploitation, alors que les dissortingbutions ActiveMQ sont des archives que vous déposez n’importe où (ou que Maven déps vous incorporez dans autre chose).

  3. Très bien 🙂 Voir Spring AMQP .

AMQP est une norme au niveau de l’application pour le middleware orienté message (MOM). JMS est une API standard pour Java pour communiquer avec MOM.

Deux applications Java différentes utilisant JMS peuvent utiliser différents MOM et ne peuvent donc toujours pas communiquer. ActiveMQ est un système MOM avec une bibliothèque JMS qui permet aux programmes Java d’y accéder via JMS, mais il ne peut pas nécessairement communiquer avec un autre programme Java JMS utilisant, par exemple, WebLogic MOM.

Différents systèmes AMQP MOM peuvent interagir les uns avec les autres (en supposant qu’ils utilisent la même version d’AMQP), étant donné que l’AMQP est une norme sur le même principe que, par exemple, SMTP. Il n’y a aucune raison qu’un système AMQP MOM ne puisse pas également fournir une bibliothèque JMS pour ses clients Java. SwiftMQ, par exemple, fournit une API JMS et utilise AMQP 1.0.

Malheureusement, tous les systèmes AMQP (et nombreux) n’utilisent pas encore la version 1.0 de l’AMQP. RabbitMQ (au moment d’écrire ces lignes) ne fournit pas encore de support pour AMQP 1.0. Certains des autres systèmes AMQP sont Apache QPID et StormMQ, mais il y en a beaucoup d’autres. Une fois que ceux-ci prennent en charge AMQP 1.0, ils doivent tous pouvoir fonctionner ensemble.

Sur leur site http://activemq.apache.org/amqp.html , ActiveMQ déclare: «Nous attendons d’ActiveMQ qu’elle mette en œuvre la dernière version, une fois celle-ci finalisée. Mais à l’heure actuelle, ActiveMQ n’implémente pas l’AMQP. Maintenant que l’AMQP 1.0 est sorti, il n’y a plus de mot d’ActiveMQ sur le moment où il le supportera.

Étant donné que RabbitMQ est un courtier AMQP où la configuration est en grande partie gérée par l’AMQP, la plupart de vos questions n’ont aucun sens.

Un problème épineux avec RabbitMQ est que de nombreux paquets d’OS sont à 1.72, ce qui est très désuet. Vous feriez bien mieux d’obtenir directement un paquet .deb ou .rpm de RabbitMQ 2.51 depuis leur site. Après cela, la seule configuration à effectuer en dehors d’AMQP consiste à créer des vhosts et des permissions utilisateur à l’aide de rabbitmqctl. Vous pouvez également télécharger les plug-ins .ez pour la console de gestion Web et les placer dans le bon répertoire avant de redémarrer RabbitMQ. Cette console de gestion Web est fortement recommandée si vous utilisez 2.51 mais impossible si vous êtes bloqué avec la valeur par défaut 1.72 que Debian et Ubuntu vous imposent.

Une fois que vous avez lancé RabbitMQ, vous pouvez utiliser n’importe quel langage et n’importe quelle bibliothèque AMQP. J’ai personnellement pris en charge un système Python en utilisant pika, amqplib et kombu. Maintenant, j’utilise haigha et la librairie Java de Scala, toutes parlant entre elles sur AMQP (et le courtier MQ bien sûr).

Comparer les concepts JMS / AMQP pour comparer ActiveMQ et RabbitMQ n’est pas le plus important: ActiveMQ parle AMQP, et il existe un client JMS pour RabbitMQ dans l’édition commerciale (appelé vFabric RabbitMQ). Pourtant, certains concepts AMQP (clés de routage) peuvent être utiles dans certains cas d’utilisation.

J’ai utilisé les deux et comme les deux:

  • Erlang + RabbitMQ est plus difficile à installer sur certains systèmes (référentiels de paquets obsolètes) que Java + ActiveMQ
  • RabbitMQ a quelques options de clustering / HA intéressantes (files d’attente en miroir, fédération de clusters). Il n’y a pas besoin d’un ZooKeeper partagé ou d’une firebase database partagée, mais il faut s’occuper du problème du “split brain”.
  • ActiveMQ est plus lourd (consommation de mémoire)
  • ActiveMQ est parfaitement intégré à Apache Camel, avec RabbitMQ, vous feriez mieux d’utiliser l’intégration du spring (Camel RabbitMQ / AMQP est un peu dur)
  • ActiveMQ prend en charge les transactions XA, peut être intégré dans les applications Java, peut intégrer Camel.
  • Le test automatisé Java avec ActiveMQ est plus facile (courtier intégré)