2010-04-07 10 views
8

Ich werte derzeit Nachrichtenwarteschlangen-Systeme und RabbitMq scheint ein guter Kandidat, also gräme ich ein wenig mehr hinein.Tut RabbitMq Round-Robin vom Exchange zu den Warteschlangen

Um einen kleinen Zusammenhang zu geben, suche ich nach etwas wie einem Austausch, der die Nachrichtenveröffentlichung auf mehrere Warteschlangen verteilt. Ich möchte die Nachrichten nicht replizieren, daher ist ein Fanout-Austausch keine Option.

Auch der Grund, warum ich daran denke, mehrere Warteschlangen gegen eine Warteschlange zu haben, die das Round-Robin mit den Konsumenten behandelt, ist, dass ich nicht möchte, dass unser einzelner Fehlerpunkt auf der Warteschlangenebene liegt.

Klingt, als könnte ich einige Logik auf der Publisher-Seite hinzufügen, um dieses Verhalten zu simulieren, indem Sie den Routing-Schlüssel bearbeiten und die entsprechenden Bindungen an Ort und Stelle haben. Aber das ist eine Art passiver Ansatz, der nicht die Geschwindigkeit des Nachrichtenverbrauchs in jeder Warteschlange berücksichtigt, was möglicherweise dazu führt, dass eine Warteschlange voll wird, wenn die Verbraucheranwendungen für diese Warteschlange tot sind.

Ich suchte nach einem proaktiveren Weg von der Exchange-Entity-Seite, die entscheiden würde, wohin die nächste Nachricht basierend auf jeder Warteschlangengröße oder etwas dieser Art gesendet werden soll.

Ich lese über Alice und die verfügbaren RESTful APIs, aber das scheint eine schwere Lösung zu sein, um schnelle Routing-Entscheidungen zu implementieren.

Wer weiß, ob Round-Robin zwischen dem Austausch der Warteschlangen within RabbitMQ dann möglich ist? Vielen Dank.

+0

Sobald wir eine einzelne Warteschlange in der Produktion getestet haben, knallten wir in ein Skalierungsproblem.Eine einzelne Warteschlange ist single-threaded. Es kann nicht mit unserer Ladung Schritt halten. Wir suchen nach Best Practices, um in einer Round-Robin-Distribution zu arbeiten. –

Antwort

4

Im AMQP-Modell sind Austauschvorgänge im Allgemeinen zustandslos, obwohl es kürzlich einige Experimente im Stateful-Exchange gab, bei denen es sowohl ein System zum Verwalten von RabbitMQ-Plugins als auch neue experimentelle Austauschtypen gibt.

Es gibt nichts, das ganz was Sie wollen, glaube ich nicht, obwohl ich nicht ganz sicher bin, verstehe ich die Anforderung. Könnte es sein, dass eine einzige Queue mit Arbeitern, die von ihr lesen, neben dem Punkt mit dem einzigen Fehlerpunkt Ihr Problem löst? Wenn dies der Fall ist, reduziert sich Ihr Problem auf die Konfiguration von RabbitMQ in einer HA-Konfiguration, die Ihnen die Verwendung dieser Lösung ermöglicht. Hierfür gibt es mehrere Möglichkeiten: Entweder verwenden Sie HALinux und einen gemeinsamen Speicher, um aktive/passive HA mit schnellem Failover zu erhalten, oder richten Sie mehr als einen parallelen Broker ein und deduplizieren Sie sie auf dem Client, möglicherweise mithilfe von redis oder ähnlichem.

Ich schlage vor, dass Sie Ihre Frage erneut in der Mailingliste rabbitmq-discuss stellen, wo mehr Leute Vorschläge machen können und wo die Diskussion für die Nachwelt archiviert werden kann.

+0

Danke für die Hilfe. Das ist eine gute Arbeit für jetzt, da ich nur in der Bewertungsphase bin. – Lancelot

1

Stimmen Sie mit Tony auf dem Ansatz überein.

Hier ist ein ‚Mashup‘ von RabbitMQ, Redis, die Sie stattdessen Ihre eigenen Walz nutzen könnten - http://xing.github.com/beetle/

0

One in Art und Weise gebaut Sie eine Form des Teilens ein Formular Austausch zu Warteschlangen tun können, aber nicht genau Round Robin, ist konsistentes Hashing. rabbitmq_consistent_hash_exchange

Wie zu https://medium.com/@eranda/rabbitmq-x-consistent-hashing-with-wso2-esb-27479b8d1d21

Papier zu erklären, bringt es Warteschlangen an einer gewichteten Verteilung auf einem Kreis und dann durch zufälligen Routing-Schlüssel sendet, wird es an die nächsten Warteschlange senden. http://www8.org/w8-papers/2a-webserver/caching/paper2.html