Schlösser und batch-Holen von Nachrichten mit RabbitMq
Ich versuche, RabbitMq in einer eher unkonventionellen Weg (obwohl an dieser Stelle kann ich wählen Sie eine andere message-queue-Implementierung, wenn nötig). Anstatt Kaninchen push-Nachrichten an meine Verbraucher, der Verbraucher eine Verbindung zu einem queue und holt einen Stapel von N Nachrichten (bei denen es belegt und mögliche lehnt einige), danach springt es zu einer anderen Warteschlange und so weiter. Dies geschieht für die Redundanz. Wenn einige Verbraucher crash-alle Nachrichten werden garantiert, um konsumiert werden, von einigen anderen Verbraucher.
Das problem ist, dass ich mehrere Verbraucher und ich will nicht, dass Sie konkurrieren über die gleiche Warteschlange. Gibt es eine Möglichkeit zu garantieren, eine Sperre, die in einer Warteschlange? Wenn nicht, kann ich zumindest sicherstellen, dass, wenn 2 Verbraucher angeschlossen werden, um die gleiche Warteschlange Sie nicht, Lesen Sie die gleiche Botschaft? Transaktionen könnte mir helfen, zu einem gewissen Grad, aber ich habe gehört die Rede, dass Sie bekommen entfernt von RabbitMQ.
Andere architektonische Vorschläge sind zu begrüßen.
Dank!
EDIT:
Wie schon in dem Kommentar es ist ein-eine Besonderheit in der, wie ich brauche zum verarbeiten der Nachrichten. Sie machen nur Sinn genommen, in Gruppen und es gibt eine hohe Wahrscheinlichkeit, dass die zugehörigen Nachrichten sind verklumpten in einer Warteschlange. Wenn zum Beispiel ziehe ich einen Stapel von 100 Nachrichten, es gibt eine hohe Wahrscheinlichkeit, dass ich in der Lage sein, etwas zu tun, mit Nachrichten 1-3, 4-5,6-10, usw. Wenn es mir nicht gelingt eine Gruppe zu finden für einige Meldungen, ich werde diese erneut an die Warteschlange. WorkQueue würde nicht funktionieren, denn es würde die Verbreitung von Nachrichten aus der gleichen Gruppe mehrere Mitarbeiter, die nicht wissen, was mit Ihnen zu tun.
- Offensichtlich werden die Verbraucher können synchronisieren sich untereinander mit so etwas wie Gossip in Fall ist dies nicht möglich, aber ich war neugierig...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie einen Blick auf das Kostenlose online-Buch auf Enterprise Integration Patterns?
Es klingt wie Sie wirklich brauchen einen workflow, wo Sie ein batcher-Komponente, bevor Sie die Nachrichten erhalten Sie an Ihre Mitarbeiter. Mit RabbitMQ es gibt zwei Möglichkeiten, das zu tun. Verwenden Sie entweder einen Austausch-Typ (und der Nachricht format), das kann das Dosieren für Sie, oder haben eine Warteschlange, und ein Arbeiter sortiert Chargen und Orte, jede charge auf Ihre eigene Warteschlange. Der Dosierer sollte wohl auch eine "batch-ready" - Nachricht an ein Steuerelement Warteschlange, so dass ein Arbeiter entdecken können, die Existenz der neuen batch-queue. Sobald der batch verarbeitet wird, die Arbeiter könnten löschen Sie die batch-queue.
Wenn Sie haben die Kontrolle über das format der Nachricht, die Sie vielleicht in der Lage zu bekommen, RabbitMQ zu tun, die Dosierungs-implizit in eine Reihe von Möglichkeiten. Mit einem Thema austauschen, Sie könnten stellen Sie sicher, dass die routing-Taste auf jede Nachricht von dem format arbeiten.batchid.etwas, und dann ein Arbeiter, der erfährt von der Existenz von batch-xxyzz verwenden würde, eine verbindliche Taste wie #.xxyzz.# nur verbrauchen diese Nachrichten. Keine erneute Veröffentlichung erforderlich.
Der andere Weg ist, um eine batch-id in einem header-und die neuere Header exchange geben. Natürlich können Sie auch schreiben Sie Ihre eigenen benutzerdefinierten exchange-Typen, wenn Sie bereit sind, zu schreiben, eine kleine Menge von Erlang-code.
Ich tun, empfehle das Buch aber, weil es gibt einen besseren überblick über die messaging-Architektur als die typische worker-queue-Konzept, dass die meisten Menschen beginnen mit.
Haben deine Verbraucher ziehen von nur einer Warteschlange. Sie werden garantiert nicht zu teilen Nachrichten (Kaninchen round-robin-die Nachrichten unter den aktuell angeschlossenen Verbrauchern) und es ist stark optimiert für die genaue Verwendung-Muster.
Es ist ready-to-use, out of the box. In der RabbitMQ-docs es heißt die Arbeit-Warteschlange Modell. Eine Warteschlange, die mehrere Verbraucher, wobei keiner von Ihnen die Freigabe nichts. Es klingt wie das, was Sie brauchen.
Können Sie eine Kanal - /Verbraucher-level-prefetch zählen zu konsumieren Nachrichten in batches. Um die re-Nachrichten senden, sollten Sie die basic.ablehnen AMQP-Methode, und diese Nachrichten können gewählt werden, dass Sie requeued oder an einen dead letter-Warteschlange. Mehrere Verbraucher versuchen, ziehen Sie Nachrichten aus derselben Warteschlange ist nicht ein Problem asthe AMQP basic.get-Methode synchronisiert werden, um zu behandeln, gleichzeitige Verbraucher.
https://groups.google.com/forum/#!Thema/rabbitmq-Benutzer/hJ8f5du-GCA