multi-threading basiert RabbitMQ Verbraucher
Wir haben ein windows-Dienst, das hören auf einzelne RabbitMQ Warteschlange und verarbeiten der Nachricht.
Wir möchten Sie herzlich derselben windows-Dienste, so dass Sie hören können mehrere Warteschlangen von RabbitMQ und verarbeiten der Nachricht.
Nicht sicher, ob das möglich sein kann durch die Verwendung von multi-threading, als jeden thread zu hören (Blockierung) der Warteschlange.
So, ich bin ganz neu multi-threading, müssen high-level-Richtlinie auf folgende Stelle, die mir helfen werden, starten Sie den Bau des Prototyps.
- Ist es möglich zu hören, mehrere Warteschlangen in der einzelnen Anwendung durch verwenden von threading?
- Wie zu handle die situation, wo, wenn jeder einzelne thread geschlossen habe
nach unten (wegen der Ausnahme usw.), wie zurück zu bringen, ohne einen Neustart des
ganzen windows-Dienste. - Jede design pattern-oder open-source-Implementierung, die mir helfen können, zu behandeln diese Art von situation.
- Eventuell ist eine doppelte: Wie zu implementieren single-consumer-multi-queue-Modell für rabbitMQ
- Nein, ich bin nicht zu Fragen, über einzelne Verbraucher mehrere Warteschlangen. Es werden mehrere Warteschlangen mit mehreren Warteschlangen, aber die Umsetzung sollte erfolgen innerhalb der einzelnen windows-Dienste. Also statt zu schreiben die mehrere windows-Dienste, die für jede Warteschlange Verbraucher, möchte ich schreiben, einzelne windows-Dienste, die hören mehrere Warteschlangen und verarbeiten der Nachricht.
- Ich schliesse mich, dies scheint nicht ein Duplikat zu sein.
- sind Sie Fragen, wie zum aggregieren von Nachrichten aus mehreren Warteschlangen in eine Warteschlange, für die Konsum eine zentrale Lage?
- Tut mir Leid, wenn mein schreiben ist nicht ganz klar. Einzelne windows-Dienst hören, um mehrere Warteschlangen auf den anderen Kanal. In anderen Worten, eine einzige Anwendung wirkt wie mehrere Verbraucher (jede Verbraucher erhalten Nachricht aus seiner Warteschlange basierend auf die route key binding). Wenn ich zu schreiben habe mehrere windows-Dienst für jeden Verbraucher wird nicht herausfordernd. Aufgrund der begrenzten Erfahrung in threading, ich bin nicht in der Lage zu denken, wie kann ich erreichen, innerhalb einzelne Anwendung durch die Verwendung von threads. Ich hoffe, dieser Kommentar wird Sinn machen. Lasst mir, wenn Ihr immer noch verwirrend, ich werde versuchen, es zu verbessern, weiter.
- EasyNetQ (easynetq.com) ist eine ziemlich vollständige open-source high-level-API für RabbitMQ, dass nicht thread-management, connection handling, Fehlerbehandlung etc. out-of-the-box.
- Wenn Sie haben keine Möglichkeit zu konfigurieren, die RabbitMQ-routing-setup (was Sie wahrscheinlich tun wird), ist es vermutlich leichter gemacht, die es gibt. Erstellen Sie eine neue Warteschlange, und geben Sie alle von den Bindungen an alle Warteschlangen, die Sie hören möchten (dh, die union von Ihren Bindungen). Dann ist die neue queue werden alle Nachrichten, die der andere queues zu tun, und Sie können einfach nur Zuhören, um die eine Warteschlange, ohne das Durcheinander von multithreading. Dies ist der Grund, warum RabbitMQ-routing vorhanden ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich mag, wie Sie schrieb Ihre Frage - es begann sehr breit und konzentriert, um die Einzelheiten. Ich erfolgreich umgesetzt haben, etwas sehr ähnlich, und arbeite derzeit an einem open-source-Projekt zu nehmen, meine Lektionen gelernt, und Sie geben zurück in die Gemeinschaft. Doch leider muss ich noch auf mein Paket, code sauber, was nicht viel helfen! Trotzdem, Ihre Fragen zu beantworten:
1. Is it possible to use threading for multiple queues.
A: ja, aber es kann voller Fallstricke. Nämlich, die RabbitMQ .NET-Bibliothek ist nicht der am besten geschriebene Teil des Codes gibt, und ich habe festgestellt, dass es eine relativ umständliche Implementierung des AMQP-Protokoll. Eines der am meisten schädlichen Vorbehalte ist, wie es mit der "Empfang" oder "Konsum" - Verhalten, das können Verklemmungen ganz einfach, wenn Sie nicht vorsichtig sind. Zum Glück ist es gut dargestellt in der API-Dokumentation.
Beratung - wenn Sie können, verwenden Sie eine singleton-connection-Objekt. Dann, in jedem thread, die die Verbindung verwenden, um eine neue zu erstellen
IModel
und die entsprechenden Verbraucher.2. How to gracefully handle exceptions in threads
- Ich glaube, das ist ein anderes Thema und ich will keine Adresse, hier gibt es mehrere Methoden, die Sie verwenden können.3. Any open-source projects?
- Ich mochte den Gedanken hinter EasyNetQ, obwohl ich endete Rollen meine eigenen sowieso. Ich werde hoffentlich daran denken zu Folgen zurück, wenn meine open-source-Projekt abgeschlossen ist, wie ich glaube, es ist eine noch bessere Verbesserung als EasyNetQ.Können Sie finden diese Antwort sehr hilfreich. Ich habe ein sehr grundlegendes Verständnis von, wie RabbitMQ funktioniert, aber ich würde wahrscheinlich gehen mit ein Abonnent pro Kanal pro thread, wie vorgeschlagen, gibt.
Gibt es sicherlich mehr als eine option zum organisieren der threading-Modell. Die tatsächliche Umsetzung hängt davon ab, wie Sie benötigen, um Nachrichten zu verarbeiten, die von mehreren Warteschlangen: entweder parallel, oder durch das zusammenfassen und Serialisierung der Verarbeitung. Der folgende code ist eine Konsolenanwendung, die sich um eine simulation von den letzteren Fall. Es verwendet die Task Parallel Library und die
BlockingCollection
Klasse (die kommt in sehr handliches für diese Art von Aufgabe).Andere Idee sein kann, um zu verwenden Reactive Extensions (Rx). Wenn Sie sich vorstellen können, die ankommenden Nachrichten zu Veranstaltungen und Rx kann helfen, das zusammenfassen in einem einzigen stream.