Comparaison de performances entre ZeroMQ, RabbitMQ et Apache Qpid

J’ai besoin d’un bus de messages très performant pour mon application, alors Apache Qpid les performances de ZeroMQ , RabbitMQ et Apache Qpid . Pour mesurer les performances, j’exécute un programme de test qui publie, par exemple, 10 000 messages en utilisant l’une des implémentations de files d’attente de messages et en exécutant un autre processus sur le même ordinateur pour consumr ces 10 000 messages. Ensuite, j’enregistre la différence de temps entre le premier message publié et le dernier message reçu.

Voici les parameters que j’ai utilisés pour la comparaison.

  1. RabbitMQ : J’ai utilisé un échange de type “fanout” et une queue avec une configuration par défaut. J’ai utilisé la bibliothèque client RabbitMQ C.
  2. ZeroMQ : Mon éditeur publie sur tcp://localhost:port1 ZMQ_PUSH avec le socket ZMQ_PUSH , mon broker écoute sur tcp://localhost:port1 port1 et renvoie le message à tcp: // localhost: port2 et mon consommateur écoute sur tcp://localhost:port2 ZMQ_PULL utilisant le socket ZMQ_PULL . J’utilise un courtier au lieu de peer to to peer communication dans ZeroMQ pour rendre la comparaison des performances équitable pour les autres mises en œuvre de queue de messages qui utilisent des courtiers.
  3. Qpid C ++ Message Broker: J’ai utilisé un échange de type “fanout” et une queue avec une configuration par défaut. J’ai utilisé la bibliothèque cliente Qpid C ++.

Voici le résultat de la performance:

  1. RabbitMQ : il faut environ 1 seconde pour recevoir 10 000 messages.
  2. ZeroMQ : Il faut environ 15 secondes pour recevoir 10 000 messages.
  3. Qpid : Il faut environ 4 secondes pour recevoir 10 000 messages.

Des questions:

  1. Quelqu’un at-il exécuté une comparaison de performances similaire entre les files d’attente de messages? Ensuite, j’aime comparer mes résultats avec les vôtres.
  2. Est-il possible de régler RabbitMQ ou Qpid pour améliorer les performances?

Remarque:

Les tests ont été effectués sur une machine virtuelle avec deux processeurs alloués. Le résultat peut varier pour différents matériels, mais je suis principalement intéressé par la performance relative des produits MQ.

    RabbitMQ fait probablement de la persistance sur ces messages. Je pense que vous devez définir la priorité du message ou une autre option dans les messages pour ne pas faire de persistance. La performance s’améliorera alors 10 fois. Vous devez vous attendre à au moins 100 000 messages / seconde via un courtier AMQP. Dans OpenAMQ, nous avons obtenu des performances allant jusqu’à 300 000 messages / seconde.

    Le protocole AMQP a été conçu pour la vitesse (par exemple, il ne décompresse pas les messages pour les acheminer), mais ZeroMQ est tout simplement mieux conçu. Par exemple, il supprime un saut en connectant des nœuds sans courtier; il fait de meilleures E / S asynchrones que toutes les stacks client AMQP; il effectue un traitement plus agressif des messages. Peut-être que 60% du temps passé à construire ZeroMQ a été consacré au réglage des performances. C’était un travail très dur. Ce n’est pas plus rapide par accident.

    Une chose que je voudrais faire, mais je suis trop occupé, est de recréer un courtier de type AMQP sur ZeroMQ. Il y a une première couche ici: http://rfc.zeromq.org/spec:15 . La stack entière fonctionnerait un peu comme RestMS, avec le transport et la sémantique séparés en deux couches. Il offrirait à peu près les mêmes fonctionnalités que AMQP / 0.9.1 (et serait sémantiquement interopérable), mais beaucoup plus rapide.

    Hmm, bien sûr, ZeroMQ sera plus rapide, il est conçu pour être et n’a pas beaucoup de fonctionnalités basées sur les courtiers que fournissent les deux autres. Le site ZeroMQ propose une comparaison merveilleuse entre les messages des courtiers et les courtiers et les inconvénients et avantages des deux.

    Blog RabbitMQ :

    RabbitMQ et 0MQ se concentrent sur différents aspects de la messagerie. 0MQ met beaucoup plus l’accent sur la façon dont les messages sont transférés sur le câble. RabbitMQ, quant à lui, se concentre sur la manière dont les messages sont stockés, filtrés et surveillés.

    (J’aime aussi le post ci-dessus de RabbitMQ car il parle également de l’utilisation de ZeroMQ avec RabbitMQ)

    Donc, ce que j’essaie de dire, c’est que vous devez choisir la technologie qui correspond le mieux à vos besoins. Si la seule exigence est la vitesse, ZeroMQ. Mais si vous avez besoin d’autres aspects tels que la persistance des messages, le filtrage, la surveillance, le basculement, etc., alors vous devez commencer à considérer RabbitMQ et Qpid.

    J’utilise un courtier au lieu de peer to to peer communication dans ZeroMQ pour rendre la comparaison des performances équitable pour les autres mises en œuvre de queue de messages qui utilisent des courtiers.

    Vous ne savez pas pourquoi vous voulez faire cela – si la seule chose qui vous tient à cœur est la performance, il n’est pas nécessaire de jouer au niveau du terrain de jeu. Si vous ne vous souciez pas de la persistance, du filtrage, etc., alors pourquoi payer le prix?

    Je me méfie également de l’exécution de tests sur les ordinateurs virtuels – il y a beaucoup de couches supplémentaires qui peuvent affecter les résultats d’une manière qui n’est pas évidente. (Sauf si vous prévoyez d’exécuter le système réel sur des machines virtuelles, bien sûr, dans ce cas, c’est une méthode très valide).

    J’ai testé c ++ / qpid

    J’ai envoyé 50000 messages par seconde entre deux machines différentes pendant une longue période sans faire la queue.

    Je n’ai pas utilisé de fanout, juste un simple échange (messages non persistants)

    Utilisez-vous des messages persistants? Vous parsingz les messages?

    Je suppose que non, puisque 0MQ n’a pas de structure de message.

    Si le courtier est principalement inactif, vous n’avez probablement pas configuré la lecture anticipée sur l’expéditeur et le récepteur. C’est très important d’envoyer de nombreux messages.

    Nous avons comparé RabbitMQ à notre file de messages persistants SocketPro ( http://www.udaparts.com/ ) sur le site http://www.udaparts.com/document/articles/fastsocketpro.htm avec tous les codes sources. Voici les résultats obtenus pour RabbitMQ:

    Même machine mise en queue et dequeue:

    “Bonjour le monde” —
    Enqueue: 30000 messages par seconde;
    Dequeue: 7000 messages par seconde.

    Texte avec 1024 octets –
    Enqueue: 11 000 messages par seconde;
    Dequeue: 7000 messages par seconde.

    Texte avec 10 * 1024 octets –
    Enqueue: 4000 messages par seconde;
    Dequeue: 4000 messages par seconde.

    Mise en queue et de queue inter-machines avec une bande passante réseau de 100 Mbits / s:

    “Bonjour le monde” —
    Enqueue: 28000 messages par seconde;
    Dequeue: 1900 messages par seconde.

    Texte avec 1024 octets –
    Enqueue: 8000 messages par seconde;
    Dequeue: 1000 messages par seconde.

    Texte avec 10 * 1024 octets –
    Enqueue: 800 messages par seconde;
    Dequeue: 700 messages par seconde.

    Essayez de configurer prefetch sur l’expéditeur et le récepteur avec une valeur comme 100. La pré-extraction de l’expéditeur ne suffit pas

    Nous avons développé un bus de message open source construit sur ZeroMQ – nous l’avons fait initialement pour remplacer Qpid. Il est sans courtier, c’est donc une comparaison tout à fait juste, mais il offre les mêmes fonctionnalités que les solutions négociées.

    Notre performance est de 140 K ms par seconde entre deux machines, mais vous pouvez voir plus de détails ici: https://github.com/Abc-Arbitrage/Zebus/wiki/Performance

    Je pense que si vous utilisez le céleri, la performance de Rabbitmq s’améliorera