Leistungsvergleich zwischen ZeroMQ, RabbitMQ und Apache Qpid

78

Ich benötige einen Hochleistungsnachrichtenbus für meine Anwendung, damit ich die Leistung von ZeroMQ, RabbitMQund bewerten kann Apache Qpid. Um die Leistung zu messen, führe ich ein Testprogramm aus, das beispielsweise 10.000 Nachrichten mit einer der Nachrichtenwarteschlangenimplementierungen veröffentlicht und einen anderen Prozess auf demselben Computer ausführt, um diese 10.000 Nachrichten zu verarbeiten. Dann zeichne ich den Zeitunterschied zwischen der ersten veröffentlichten und der zuletzt empfangenen Nachricht auf.

Im Folgenden sind die Einstellungen aufgeführt, die ich für den Vergleich verwendet habe.

  1. RabbitMQ: Ich habe einen Austausch vom Typ "Fanout" und eine Warteschlange mit Standardkonfiguration verwendet. Ich habe die RabbitMQ C-Clientbibliothek verwendet.
  2. ZeroMQ: Mein Publisher veröffentlicht tcp://localhost:port1mit ZMQ_PUSHSocket. Mein Broker hört zu tcp://localhost:port1und sendet die Nachricht erneut an tcp: // localhost: port2. Mein Konsument hört auf die tcp://localhost:port2Verwendung von ZMQ_PULLSocket. Ich verwende einen Broker anstelle einer Peer-to-Peer-Kommunikation ZeroMQ, um den Leistungsvergleich mit anderen Implementierungen der Nachrichtenwarteschlange, die Broker verwenden, fair zu gestalten.
  3. QpidC ++ - Nachrichtenbroker: Ich habe einen Austausch vom Typ "Fanout" und eine Warteschlange mit Standardkonfiguration verwendet. Ich habe die Qpid C ++ - Clientbibliothek verwendet.

Es folgt das Leistungsergebnis:

  1. RabbitMQ: Es dauert ungefähr 1 Sekunde, um 10.000 Nachrichten zu empfangen.
  2. ZeroMQ: Es dauert ungefähr 15 Millisekunden, um 10.000 Nachrichten zu empfangen.
  3. Qpid: Der Empfang von 10.000 Nachrichten dauert ca. 4 Sekunden.

Fragen:

  1. Hat jemand einen ähnlichen Leistungsvergleich zwischen den Nachrichtenwarteschlangen durchgeführt? Dann vergleiche ich meine Ergebnisse gerne mit Ihren.
  2. Gibt es eine Möglichkeit , die Leistung zu optimieren RabbitMQoder Qpidzu verbessern?

Hinweis:

Die Tests wurden auf einer virtuellen Maschine mit zwei zugewiesenen Prozessoren durchgeführt. Das Ergebnis kann für verschiedene Hardware unterschiedlich sein, ich bin jedoch hauptsächlich an der relativen Leistung der MQ-Produkte interessiert.

Ahsankhan
quelle
3
Ich habe vor Monaten einfache Tests mit ähnlichen Ergebnissen durchgeführt. Und ich habe festgestellt, dass das System bei der Arbeit mit RabbitMQ oder Qpid ziemlich untätig ist. Ich denke, etwas muss falsch sein.
Gary Shi
"RabbitMQ: Es dauert ungefähr 12 Sekunden, um 10.000 Nachrichten zu empfangen." - In unseren eigenen Tests sehen wir regelmäßig einen Eintritt von 20-25.000 / s pro CPU. Sie machen also etwas falsch oder verwenden einen langsamen Client. Haben Sie versucht, rabbitmq-disk per E-Mail mit Fragen zu kontaktieren?
1
Hier ist ein guter Vergleich vom 10. April 2013: x-aeon.com/wp/2013/04/10/…
Daniel F
3
Eine aktualisierte Version des Leistungsvergleichs von RabbitMQ, Kafka, HornetQ, ActiveMQ, SQS und Mongo ist jetzt hier: softwaremill.com/mqperf
adamw
2
Jede Nachricht war wie viele Bytes, als Sie diesen Test durchgeführt haben?
Arsenal

Antworten:

102

RabbitMQ arbeitet wahrscheinlich an diesen Nachrichten. Ich denke, Sie müssen die Nachrichtenpriorität oder eine andere Option in Nachrichten festlegen, um keine Persistenz zu erreichen. Die Leistung wird sich dann um das 10-fache verbessern. Sie sollten mindestens 100.000 Nachrichten pro Sekunde über einen AMQP-Broker erwarten. In OpenAMQ haben wir eine Leistung von bis zu 300.000 Nachrichten / Sekunde.

AMQP wurde auf Geschwindigkeit ausgelegt (z. B. entpackt es keine Nachrichten, um sie weiterzuleiten), aber ZeroMQ ist in wichtigen Punkten einfach besser konzipiert. Zum Beispiel wird ein Hop entfernt, indem Knoten ohne Broker verbunden werden. Es bietet bessere asynchrone E / A-Vorgänge als alle AMQP-Client-Stacks. Es führt eine aggressivere Nachrichtenverarbeitung durch. Möglicherweise wurden 60% der Zeit, die für die Erstellung von ZeroMQ aufgewendet wurde, für die Leistungsoptimierung aufgewendet. Es war sehr harte Arbeit. Es ist nicht zufällig schneller.

Eine Sache, die ich gerne tun würde, aber zu beschäftigt bin, ist die Neuerstellung eines AMQP-ähnlichen Brokers über ZeroMQ. Hier gibt es eine erste Ebene: http://rfc.zeromq.org/spec:15 . Der gesamte Stapel würde ähnlich wie RestMS funktionieren, wobei Transport und Semantik in zwei Ebenen unterteilt sind. Es würde fast die gleiche Funktionalität wie AMQP / 0.9.1 bieten (und semantisch interoperabel sein), jedoch erheblich schneller.

Pieter Hintjens
quelle
Wir werden weiterhin rabbitmq verwenden, bis jemand eine bessere Lösung als @pieter btw findet. es erinnert mich an eine großartige Patentgeschichte [1]. [1] youtube.com/watch?v=5QqbDyZ8Eu4
Kunthar
55
RIP Kumpel, du hast ein paar tolle Sachen gebaut
Gillespie
33

Hmm, natürlich wird ZeroMQ schneller sein, es ist so konzipiert und verfügt nicht über viele der Broker-basierten Funktionen, die die anderen beiden bieten. Die ZeroMQ-Site bietet einen wunderbaren Vergleich zwischen Broker und Brokerless Messaging sowie die Nachteile und Vorteile beider.

RabbitMQ Blog :

RabbitMQ und 0MQ konzentrieren sich auf verschiedene Aspekte des Messaging. 0MQ konzentriert sich viel mehr darauf, wie die Nachrichten über die Leitung übertragen werden. RabbitMQ hingegen konzentriert sich darauf, wie Nachrichten gespeichert, gefiltert und überwacht werden.

(Ich mag auch den obigen RabbitMQ-Beitrag, da er auch über die Verwendung von ZeroMQ mit RabbitMQ spricht.)

Ich versuche also zu sagen, dass Sie sich für die Technologie entscheiden sollten, die Ihren Anforderungen am besten entspricht. Wenn die einzige Anforderung Geschwindigkeit ist, ZeroMQ. Aber wenn Sie andere Aspekte wie die Persistenz von Nachrichten, das Filtern, Überwachen, Failover usw. benötigen, müssen Sie RabbitMQ & Qpid in Betracht ziehen.

Steve Casey
quelle
4
ZeroMQ hat keinen Broker. Sie entwerfen den Broker als Teil des Gesamtdesigns der Anwendung, und Ihr Broker lauscht auf einer Null, indem er Nachrichten entsprechend ihrem Ziel weiterleitet. ZeroMQ erledigt nur einen Job und macht es sehr gut: Nachrichtenwarteschlange. Es gibt Malamute, eine Broker-Implementierung, die von den ZeroMQ-Mitarbeitern für ZeroMQ entwickelt wurde, aber nicht sofort Teil von ZeroMQ ist. Es ist ein Dienst, den Sie zusammen mit ZeroMQ in einem eigenen Prozess oder auf einer separaten Box installieren können, die der Nachrichtenvermittlung gewidmet ist. Es ist ein eigenes Projekt. github.com/zeromq/malamute
Neil Davis
Ja, ich habe angegeben, dass es keinen Broker gibt und bin mit einem Artikel in Broker vs Brokerless verknüpft. War das nicht klar? Als ich diese Antwort 2011 veröffentlichte, gab es auch keinen Malamute, der im Oktober 2014 erschien
Steve Casey
4

Ich verwende einen Broker anstelle einer Peer-to-Peer-Kommunikation in ZeroMQ, um den Leistungsvergleich mit anderen Nachrichtenwarteschlangenimplementierungen, die Broker verwenden, fair zu gestalten.

Sie sind sich nicht sicher, warum Sie das tun möchten. Wenn Sie sich nur um die Leistung kümmern, müssen Sie das Spielfeld nicht angleichen. Wenn Sie sich nicht für Persistenz, Filterung usw. interessieren, warum dann den Preis zahlen?

Ich bin auch sehr misstrauisch, Benchmarks auf VMs auszuführen - es gibt viele zusätzliche Ebenen, die die Ergebnisse auf eine Weise beeinflussen können, die nicht offensichtlich ist. (Es sei denn, Sie planen, das reale System auf VMs auszuführen. In diesem Fall ist dies eine sehr gültige Methode.)

WallStProg
quelle
3

Ich habe c ++ / qpid getestet

Ich habe lange Zeit 50000 Nachrichten pro Sekunde zwischen zwei verschiedenen Computern ohne Warteschlangen gesendet.

Ich habe kein Fanout verwendet, nur einen einfachen Austausch (nicht persistente Nachrichten)

Verwenden Sie dauerhafte Nachrichten? Analysieren Sie die Nachrichten?

Ich nehme nicht an, da 0MQ keine Nachrichtenstrukturen hat.

Wenn der Broker hauptsächlich inaktiv ist, haben Sie den Prefetch für Absender und Empfänger wahrscheinlich nicht konfiguriert. Dies ist sehr wichtig, um viele Nachrichten zu senden.

Joseluis
quelle
Ich verwende eine nicht dauerhafte Warteschlange. Ich analysiere die Nachricht nicht. Tatsächlich verwende ich denselben Code, um Nachrichten für alle drei Warteschlangenexperimente zu generieren. Das Ändern des Austauschtyps in "Direkt" hatte keine Auswirkungen auf die Leistung. Auch nach Verwendung der Senderflusskontrolle (API-Sender.SetCapaclity (8)) wurde das Timing schlechter. Ohne die Senderflusskontrolle scheint die Warteschlange unbegrenzt zu werden. Haben Sie bei der Zeitmessung gewartet, bis alle Nachrichten empfangen wurden und die Warteschlange vollständig leer ist?
Ahsankhan
1
Ich fand heraus, dass das qpid-perftest-Programm Qpids "altes Messaging-Apis" verwendet. Der Wechsel zum alten Apis hat die Leistung in meinem Test zehnmal verbessert.
Ahsankhan
1

Wir haben RabbitMQ mit unserer persistenten Nachrichtenwarteschlange SocketPro ( http://www.udaparts.com/ ) auf der Website http://www.udaparts.com/document/articles/fastsocketpro.htm mit allen Quellcodes verglichen . Hier sind die Ergebnisse, die wir für RabbitMQ erhalten haben:

Gleiche Maschinen-Enqueue und Dequeue:

"Hallo Welt" -
Enqueue: 30000 Nachrichten pro Sekunde;
Warteschlange: 7000 Nachrichten pro Sekunde.

Text mit 1024 Bytes -
Enqueue: 11000 Nachrichten pro Sekunde;
Warteschlange: 7000 Nachrichten pro Sekunde.

Text mit 10 * 1024 Bytes -
Enqueue: 4000 Nachrichten pro Sekunde;
Warteschlange: 4000 Nachrichten pro Sekunde.

Maschinenübergreifende Warteschlange und Warteschlange mit einer Netzwerkbandbreite von 100 MBit / s:

"Hallo Welt" -
Enqueue: 28000 Nachrichten pro Sekunde;
Warteschlange: 1900 Nachrichten pro Sekunde.

Text mit 1024 Bytes -
Enqueue: 8000 Nachrichten pro Sekunde;
Warteschlange: 1000 Nachrichten pro Sekunde.

Text mit 10 * 1024 Bytes -
Enqueue: 800 Nachrichten pro Sekunde;
Warteschlange: 700 Nachrichten pro Sekunde.

Gemeinschaft
quelle
0

Versuchen Sie, Prefetch für Absender und Empfänger mit einem Wert wie 100 zu konfigurieren. Es reicht nicht aus, nur Absender vorab abzurufen

Jale
quelle
Für qpid hatte ich den Eindruck, dass Receiver.setCapacity (100) den Prefetch für den Empfänger festlegt. Danach verbesserte sich die Leistung für den Code mit "new qpid api" um das Zehnfache, und die Leistung war ähnlich wie bei der alten Qpid-Messaging-API. Ich habe den Beitrag mit dem Ergebnis aktualisiert. Qpid scheint jedoch immer noch viermal langsamer zu sein als rabbitmq.
Ahsankhan
0

Wir haben einen Open-Source-Nachrichtenbus entwickelt, der auf ZeroMQ aufbaut. Wir haben dies zunächst getan, um Qpid zu ersetzen. Es ist maklerlos, daher kein fairer Vergleich, bietet jedoch die gleiche Funktionalität wie vermittelte Lösungen.

Unsere Gesamtleistung beträgt 140.000 Nachrichten pro Sekunde zwischen zwei Computern. Weitere Informationen finden Sie hier: https://github.com/Abc-Arbitrage/Zebus/wiki/Performance

Slugart
quelle