RabbitMQ mit dem Beispiel: Mehrere Threads, Kanäle und Warteschlangen
Ich habe gerade gelesen RabbitMQ-Java-API-docsund fand es sehr informativ und geradlinig. Beispiel für das einrichten eines einfachen Channel
für die Veröffentlichung/konsumieren ist sehr einfach zu Folgen und zu verstehen. Aber es ist ein sehr einfaches/einfaches Beispiel, und es blieb mir eine wichtige Frage: Wie kann ich 1+ Channels
zu veröffentlichen/zu verbrauchen und aus mehreren Warteschlangen?
Sagen wir, ich habe ein RabbitMQ-server mit 3 queues: logging
security_events
und customer_orders
. So würden wir brauchen entweder eine einzelne Channel
die Möglichkeit haben, zu veröffentlichen/konsumieren, um alle 3-Warteschlangen, oder, wahrscheinlicher, haben 3 separate Channels
jeder, der sich in einer einzigen Warteschlange.
Oben auf diese RabbitMQ best practices diktieren, dass wir 1 Channel
pro Verbraucher-thread. Für dieses Beispiel, sagen wir mal security_events
ist gut mit nur 1 Verbraucher-thread, aber logging
und customer_order
beide brauchen 5 threads für die Lautstärke. Also, wenn ich das richtig verstehe, heißt das, wir brauchen:
- 1
Channel
und 1 Verbraucher-thread für die Veröffentlichung/konsumieren zu und vonsecurity_events
; und - 5
Channels
- und 5-consumer-threads für die Veröffentlichung/konsumieren zu und vonlogging
; und - 5
Channels
- und 5-consumer-threads für die Veröffentlichung/konsumieren zu und voncustomer_orders
?
Wenn mein Verständnis ist falsch hier, bitte beginnen Sie, indem korrigiert wird, wie mir. So oder so, könnten einige Schlacht-müde RabbitMQ-veteran mir helfen "Verbinde die Punkte" mit einem anständigen code-Beispiel für das einrichten Verlage/Verbraucher, die erfüllen meine Anforderungen hier? Vielen Dank im Voraus!
InformationsquelleAutor der Frage | 2013-08-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, Sie haben einige Probleme mit anfänglichen Verständnis. Ehrlich gesagt, ich bin ein bisschen überrascht zu sehen, die folgenden:
both need 5 threads to handle the volume
. Wie hast du dich identifizieren müssen, die genaue Zahl? Haben Sie eine garantiert 5 threads reichen wird???Lassen Sie uns versuchen, um zu überprüfen das problem und finden eine passende Lösung. BTW, message queue selbst wird nicht garantiert, Sie haben wirklich gute Lösung. Sie haben, um zu verstehen, was Sie tun und auch tun, einige weitere Tests.
Als Sie definitiv wissen, es gibt viele layouts möglich:
Verwende ich layout
B
als der einfachste Weg, um zu zeigen1
ProduzentN
Verbraucher-problem. Da du so besorgt bist, den Durchsatz. BTW, wie man erwarten könnte RabbitMQ verhält sich ganz gut (Quelle). Achten Sie aufprefetchCount
ich kläre es später:So ist es wahrscheinlich, message processing logic ist eine richtige Ort, um sicherzustellen, Sie haben genug Durchsatz. Natürlich können Sie überspannen einen neuen thread jedes mal, wenn Sie brauchen, um eine Nachricht zu verarbeiten, aber irgendwann ist ein solcher Ansatz wird töten Ihrem system. Im Grunde, mehr threads, haben Sie größere Latenz erhalten Sie (Sie können überprüfen, Amdahl ' s law wenn Sie wollen).
(siehe Amdahl ' s law illustriert)
Tipp #1: Seien Sie vorsichtig mit threads, ThreadPools verwenden (details)
Tipp #2: Seien Sie vorsichtig mit message-processing-overhead
Ich würde sagen, das ist offensichtlich, Optimierung der Technik. Es ist wahrscheinlich, dass Sie ' ll senden Sie klein und leicht sind, Nachrichten zu verarbeiten. Der gesamte Ansatz wird über kleinere Nachrichten werden kontinuierlich eingestellt und verarbeitet. Große Nachrichten, die schließlich einen bösen Streich spielen, so ist es besser, dies zu vermeiden.
So ist es besser, senden Sie kleine Stücke von Informationen, aber was über die Verarbeitung? Es ist ein Aufwand jedes mal, wenn Sie submit a job. Batch-Verarbeitung kann sehr hilfreich sein im Falle von high-eingehende Nachricht-rate.
Zum Beispiel, sagen wir, wir haben einfach message processing logic und wir nicht wollen, um thread-spezifische Gemeinkosten jeder Zeit die Nachricht verarbeitet wird. Um diese zu optimieren, dass sehr einfache
CompositeRunnable can be introduced
:Oder tun Sie das gleiche in einer etwas anderen Weise, durch das sammeln von Nachrichten verarbeitet werden:
In einer Weise, die Sie Nachrichten verarbeiten kann, die mehr effektiv.
Tipp #3: Optimieren der Nachrichtenverarbeitung
Trotz der Tatsache, die Sie wissen, kann die Verarbeitung von Nachrichten in parallel (
Tip #1
) und reduzieren processing-overhead (Tip #2
) Sie haben alles zu tun schnell. Redundante Bearbeitungsschritte, schwere Schleifen und so weiter, die die Leistung beeinträchtigen können, eine Menge. Finden Sie interessante case-study:Die Verbesserung der Message-Queue-Durchsatz um das Zehnfache durch die Wahl der richtigen XML-Parser
Tipp #4: Anschluss-und Channel-Management
round-trip - starten Sie eine neue Verbindung dauert mehrere.
während es geht. Andere als die, die multiplexing-Verfahren ist relativ transparent.
überlastet - es ist eine gute Idee zu trennen, veröffentlichen und nutzen
verbindungen
(Quelle)
Bitte beachten Sie, alle Tipps sind perfekt zusammenarbeiten. Fühlen Sie sich frei, zu lassen mich wissen, wenn Sie weitere Informationen benötigen.
Complete Verbraucher-Beispiel (Quelle)
Bitte beachten Sie Folgendes:
prefetchCount
sehr hilfreich sein könnte:Beispiel:
Können Sie auch prüfen, die folgenden:
InformationsquelleAutor der Antwort
Wie kann ich 1+ - Kanäle zu veröffentlichen/zu verbrauchen und aus mehreren Warteschlangen?
Den folgenden Code Beispiel erklären, wie Sie es getan in der client-Seite.
ZB:
Der routing-key verwendet wird, identifizieren Sie den Typ des Kanals ermittelt werden und die Arten.
Sie Schauen können hier für mehr details über die Kategorisierung ..
Threads Teil
In diesem Teil können Sie Holen Sie sich die Veröffentlichten Daten auf der basis der Kategorie. ie; routing-Taste, die in deinem Fall ist die Anmeldung, security_events und customer_orders etc.
Blick in die Beispiel wissen, wie die Daten abzurufen, die in threads.
ZB :
Aussehen hier für mehr details über die threads Teil..
InformationsquelleAutor der Antwort Dileep
Warum zur Umsetzung alles selbst?
Versuchen, irgendeine Art von integration framework. Sagen wir Camel bereits Bündel-Anschluss an verschiedene Systeme, Rabbit MQ enthalten Camel Rabbit MQ.
Müssen Sie nur definieren Sie Ihre Routen.
Zum Beispiel:
Wollen Sie konsumieren Nachrichten aus der Anmeldung Warteschlange von 5 gleichzeitige Verbraucher in eine Datei.
Gibt es viele Optionenwie man set-Dateien, die Verbraucher. Wie Sie sehen können können Sie definieren, wie viele Verbraucher gerade laichen, indem Sie
concurrentConsumers=5
in Ihre URI. Wenn Sie möchten, können Sie erstellen Sie Ihre eigenen Erzeuger oder Verbraucher durch die Implementierung von Prozessor-Schnittstelle.Ist es sehr vielseitiges und mächtiges framework, die Sie tun können eine Menge Arbeit nur durch die Verwendung der bereitgestellten Komponenten. Das web-Projekt enthält eine Reihe von Beispielen und Dokumentation.
InformationsquelleAutor der Antwort Milan Baran