Ich benötige einen Hochleistungsnachrichtenbus für meine Anwendung, damit ich die Leistung von ZeroMQ
, RabbitMQ
und 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.
RabbitMQ
: Ich habe einen Austausch vom Typ "Fanout" und eine Warteschlange mit Standardkonfiguration verwendet. Ich habe die RabbitMQ C-Clientbibliothek verwendet.ZeroMQ
: Mein Publisher veröffentlichttcp://localhost:port1
mitZMQ_PUSH
Socket. Mein Broker hört zutcp://localhost:port1
und sendet die Nachricht erneut an tcp: // localhost: port2. Mein Konsument hört auf dietcp://localhost:port2
Verwendung vonZMQ_PULL
Socket. Ich verwende einen Broker anstelle einer Peer-to-Peer-KommunikationZeroMQ
, um den Leistungsvergleich mit anderen Implementierungen der Nachrichtenwarteschlange, die Broker verwenden, fair zu gestalten.Qpid
C ++ - 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:
RabbitMQ
: Es dauert ungefähr 1 Sekunde, um 10.000 Nachrichten zu empfangen.ZeroMQ
: Es dauert ungefähr 15 Millisekunden, um 10.000 Nachrichten zu empfangen.Qpid
: Der Empfang von 10.000 Nachrichten dauert ca. 4 Sekunden.
Fragen:
- Hat jemand einen ähnlichen Leistungsvergleich zwischen den Nachrichtenwarteschlangen durchgeführt? Dann vergleiche ich meine Ergebnisse gerne mit Ihren.
- Gibt es eine Möglichkeit , die Leistung zu optimieren
RabbitMQ
oderQpid
zu 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.
quelle
Antworten:
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.
quelle
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 :
(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.
quelle
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.)
quelle
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.
quelle
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:
Maschinenübergreifende Warteschlange und Warteschlange mit einer Netzwerkbandbreite von 100 MBit / s:
quelle
Versuchen Sie, Prefetch für Absender und Empfänger mit einem Wert wie 100 zu konfigurieren. Es reicht nicht aus, nur Absender vorab abzurufen
quelle
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
quelle