Was könnten Leistungserwartungen von RabbitMQ auf EC2 sein? Würde schätzen, Erfahrung hier zu teilen.
Ich versuche, RabbitMQ auf aws EC2 zu testen. Ich habe 3 separate EC2-Instanzen für RabbitMQ, Publisher und Consumer / Worker.
Das Szenario, das ich habe, ist, dass Publisher die JSON-Zeichenfolge (ca. 165-200 Byte) an den Typ "direct" mit der dauerhaften Gruppe "true" und die Warteschlange mit der dauerhaften Eigenschaft "true" (d. h. beide im persistenten Modus) austauscht. Consumer / Worker läuft auf separater Box - zieht ständig Nachrichten. (Es wird erwartet, dass die Weiterleitung dieser Nachrichten an den Worker in MongoDB beibehalten wird und Publisher wird durch den Restful-Dienst mit REST easy ersetzt)
Um die Dinge einfach zu halten, habe ich dieses Szenario mit Multicast-Beispielcode simuliert. Ich hatte Multicast-Code in zwei separate Java-Datei, nämlich "Producer" und "Worker" aufgeteilt, um jedes auf separaten Kasten zu laufen. Ich habe "c1.mediam" EC2 mit Ubuntu Server v11.4 32 Bit für den laufenden Producer und Consumer und "m1.large" mit dem Ubuntu Server v11.4 64 Bit für RabbitMQ benutzt.
Ich bin in der Lage, einen Durchsatz von 3-5k Nachrichten pro Sekunde zu erreichen, d. h. die Study-Message-Push-Rate auf 5K zu halten. (Dies stimmt mit Ссылка überein)
Außerdem, wenn ich die Push-Rate auf 10-12k Nachrichten pro Sekunde erhöhe. Die Fähigkeit des Verbrauchers, Nachrichten zu konsumieren, fällt auf 1-2.000 Nachrichten pro Sekunde und es erzeugt einen Rückstand (Viel Zeit geht es auch unter 800 Nachrichten pro Sekunde).
Mit dem obigen Szenario habe ich folgende Fragen und würde Gedanken / Vorschläge schätzen, um den Durchsatz des Verbrauchers zu verbessern. (HINWEIS: Alle Nachrichten in meinem Szenario werden mit einem ähnlichen Typ erwartet, der keine Möglichkeit bietet, sie für das Routing zu gruppieren, daher kann eine Art Load-Balancer-Ansatz erforderlich sein)
1) Diese Leistung wird mit einem rabbitMQ-Server, einer Vermittlungsstelle und einer Warteschlange beobachtet. Kann noch etwas weiter konfiguriert werden, fein abgestimmt, um den Durchsatz im persistenten Modus auf mehr als 5k zu improvisieren.
2) Ich verstehe, Clustering könnte eine andere Option sein. Allerdings muss ich den Cluster basierend auf der eingehenden Last einstellen, und ich bekomme möglicherweise keine Nachrichtengruppierung / -identität, um das Routing zu definieren (da erwartet wird, dass Nachrichten nur eine Protokollbeschreibung sind). Kann ich nach der Load Balancing-Option für Arbeiter / Verbraucher Clustering haben?
3) Ich werde voraussichtlich mehrere hunderttausend Anfragen pro Sekunde bearbeiten. Ich würde gerne einige Erfahrungen und Ansätze teilen, um dies zu erreichen.
Haben Sie darüber nachgedacht, mehrere Verbraucher hinzuzufügen? Dies ist einer der Hauptvorteile einer lose gekoppelten Bus- / Nachrichtenarchitektur im Vergleich zu einer streng gekoppelten Architektur. Es kann helfen, die Notwendigkeit für das Nachrichtenvolumen zu verstehen. Ist dies ein Benchmark, nur um zu sehen, was Sie tun können, oder ist das an eine tatsächliche Anwendung gebunden?
Hunderte von kHz sind sehr, sehr hoch: Wenn RabbitMQ das überhaupt kann, dann betrachten Sie das Partitionieren über geclusterte Knoten. Diese Autoren fanden heraus, dass ihre EC2-Instanzen höchstens verarbeiten konnten 100K Pakete / Sekunde, so dass Sie den Nachrichten-Durchsatz natürlich nicht durch eine einzelne Instanz erhöhen können.
Sie könnten Kafka untersuchen, das von LinkedIn für eine ähnliche Art von großflächigem Feuerwehrmodell geschrieben wurde. Es führt zu einer gewissen Komplexität bei den Verbrauchern, um eine echte Verteiltheit und einen geringeren Nachrichtenaufwand zu ermöglichen.
Welche Art von Speicher verwenden Sie für die EC2-Instanzen? EBS-Speicher ist zuverlässiger, aber manchmal hat er einen sehr geringen Durchsatz (besonders wenn es ein kleines EBS-Volumen ist, d. H. & Lt; 100 GB). Der Instanzspeicher hat dagegen eine wesentlich bessere E / A-Leistung (zumindest aus unserer Erfahrung), kann aber nur so lange "leben", wie die Instanz ausgeführt wird. Ein weiterer Unterschied ist der von Ihnen verwendete Instanzentyp. m1.small und c1.medium haben beide eine moderate IO-Leistung (http://aws.amazon.com/ec2/instance-types/).
Wir betreiben RabbitMQ in EC2 mit Persistenz für alle Nachrichten. Wir verwenden nur m1.large Instanzen (64bit mit hoher IO Performance). Wir begannen mit dem EBS-Speicher und wechselten dann zum Instance-Store, um zu sehen, ob es Verbesserungen gibt. Und Instance-Store-Instanzen sind schneller in Bezug auf E / A-Durchsatz. Der Nachteil besteht jedoch darin, dass alle fortdauernden Nachrichten zusammen mit der Beendigung / dem Ausfall der Instanz verloren gehen (obwohl wir bisher noch nie einen Fehler erlebt haben). In unserem Szenario brauchen wir keinen so großen Durchsatz, aber uns ist es wichtig, wenn unsere Nachrichten verloren gehen: -)
Zusammenfassend können Sie versuchen, zu einem Instance-Store-Setup zu wechseln, um zu sehen, wie das gehandhabt wird, wenn es Verbesserungen gibt. Und wenn das viel besser funktioniert, dann ist Ссылка eine Lösung, um den Fehler zu überwinden. Zumindest in diese Richtung wechseln wir.
Prost
Tags und Links java performance rabbitmq amazon-ec2 cluster-computing